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 进行授权





