Lua与C\C++语言的交互-从编译源码开始
Lua与C\C++语言的交互-从编译源码开始
前言
Lua
本身是用 C
编写的,因此扩展和嵌入其他语言是非常便捷的。
C函数和参数
C
语言是用汇编实现的,在汇编语言中可没有函数的概念,与函数对应的是叫做子过程的东西,子过程就是一段指令,一个子过程与它调用的子过程之间通过栈来进行参数的传递交互。在一个子过程在调用别的子过程之前,会按照约定的格式将要调用的子过程需要的参数入栈,在被调用的子过程中,可以按照约定的规则将参数从栈中取出。同理,对于返回值的传递也同样是通过堆栈进行的。C语言约定的参数放入栈中的格式,就是“调用惯例”。C语言的函数原型则决定了压入栈中的参数的数量和类型。
Lua的虚拟堆栈
由于C
和Lua
是不同层次的语言,因此C
语言的变量和Lua
中的变量以及函数不能直接的交互。Lua
和C
之间的交互巧妙的模拟了C
语言的堆栈,Lua
和C
语言之间的相互调用和访问都通过堆栈来进行,巧妙的解决了不同类型之间变量相互访问的问题。
画个示意图:
Lua源码的编译
准备工作
下载Lua源码并解压。(我以Lua 5.3.4为例) »点击下载
编译工作
新建VS工程
VS
新建 一个C++
静态库 项目。- 在 解决方案管理器 面板,将 下载的
Lua5.3.4
源码的src
目录 下的.h
添加到 头文件 里。 - 在 解决方案管理器 面板,将 下载的
Lua5.3.4
源码的src
目录 下的.C
添加到 源文件 里。
修改项目配置
- 在 解决方案管理器 面板,
右击 -> 属性 -> C/C++ -> 常规 -> 附加包含目录
添加 下载的Lua5.3.4
源码的src
目录 。如下图所示:
- 在属性页面
C/C++ -> 高级 -> 编译为
选择 :编译为 C 代码(/TC)
。如下图所示
- 开始编译,可以看到控制台输出的库文件目录。
HaloLua工程
新建一个 C++控制台应用程序 工程
修改项目配置
在 解决方案管理器 面板,
右击 -> 属性 -> C/C++ -> 常规 -> 附加包含目录
添加 下载的Lua5.3.4
源码的src
目录 。添加上一步编译好的库,
连接器 -> 常规 -> 附加库目录
,选择 你对应的lib
所在路径。在
连接器 -> 输入 -> 附加依赖项
,填上你编译出来的lib
库文件名。
编写lua测试
在源文件里新建一个
halo.lua
文件。在
main.cpp
或 对应的.h
文件 里,引用头文件。
1 2 #include <iostream> #include <lua.hpp>
halo.lua
里编写print("halo world")
在
main
函数里编写后,运行编译。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using namespace std;
int main()
{
printf("System Begin ... \n");
lua_State *L = luaL_newstate();
luaL_openlibs(L);
luaL_dofile(L,"halo.lua");
lua_close(L);
system("pause");
return 0;
}
如果看到如下输出则表示成功了。
本文由作者按照 CC BY 4.0 进行授权