文章

Lua与C\C++语言的交互-从编译源码开始

Lua与C\C++语言的交互-从编译源码开始

前言

Lua 本身是用 C 编写的,因此扩展和嵌入其他语言是非常便捷的。

C函数和参数

C语言是用汇编实现的,在汇编语言中可没有函数的概念,与函数对应的是叫做子过程的东西,子过程就是一段指令,一个子过程与它调用的子过程之间通过栈来进行参数的传递交互。在一个子过程在调用别的子过程之前,会按照约定的格式将要调用的子过程需要的参数入栈,在被调用的子过程中,可以按照约定的规则将参数从栈中取出。同理,对于返回值的传递也同样是通过堆栈进行的。C语言约定的参数放入栈中的格式,就是“调用惯例”。C语言的函数原型则决定了压入栈中的参数的数量和类型。

Lua的虚拟堆栈

由于CLua是不同层次的语言,因此C语言的变量和Lua中的变量以及函数不能直接的交互。LuaC之间的交互巧妙的模拟了C语言的堆栈,LuaC语言之间的相互调用和访问都通过堆栈来进行,巧妙的解决了不同类型之间变量相互访问的问题。

画个示意图:

Lua源码的编译

准备工作

下载Lua源码并解压。(我以Lua 5.3.4为例) »点击下载

编译工作

新建VS工程

  1. VS 新建 一个 C++ 静态库 项目。
  2. 解决方案管理器 面板,将 下载的Lua5.3.4 源码的 src目录 下的 .h添加到 头文件 里。
  3. 解决方案管理器 面板,将 下载的Lua5.3.4 源码的 src目录 下的 .C添加到 源文件 里。

修改项目配置

  1. 解决方案管理器 面板,右击 -> 属性 -> C/C++ -> 常规 -> 附加包含目录 添加 下载的Lua5.3.4 源码的 src目录 。如下图所示:

  1. 在属性页面 C/C++ -> 高级 -> 编译为 选择 : 编译为 C 代码(/TC) 。如下图所示

  1. 开始编译,可以看到控制台输出的库文件目录。

HaloLua工程

新建一个 C++控制台应用程序 工程

修改项目配置

  1. 解决方案管理器 面板,右击 -> 属性 -> C/C++ -> 常规 -> 附加包含目录 添加 下载的Lua5.3.4 源码的 src目录

  2. 添加上一步编译好的库,连接器 -> 常规 -> 附加库目录 ,选择 你对应的lib所在路径。

  3. 连接器 -> 输入 -> 附加依赖项 ,填上你编译出来的lib 库文件名。

编写lua测试

  1. 在源文件里新建一个halo.lua 文件。

  2. main.cpp 或 对应的 .h 文件 里,引用头文件。

1
2
#include <iostream>
#include <lua.hpp>
  1. halo.lua 里编写 print("halo world")

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