0%

C++和lua混合程序设计

环境配置

库编译

从官网下载的版本是 5.1.4 ,配合《lua设计与实现》在 Linux/Windows 编译,在 Windows 上编译的过程中 有些小坑,记录下这些,以后不用再话费时间重复劳动了。

vs2019 新建 dll 项目,将 src 路径下所有文件拷贝到工程路径并添加到解决方案,并在工程路径上一级目录新建 bin、lib 两个文件夹,用于输出生成的 dll 和 lib 文件,不适用预编译头 .pch 文件。

实验发现编译工程会生成 dll 文件,但是无 lib 文件生成,在 luaconf.h 文件 154 行发现说明,需要在工程添加 宏定义 LUA_BUILD_AS_DLL

将“属性-链接器-高级-导入库”,设置为 ..\lib$(TargetName).lib,再次编译程序即可。

测试工程

新建控制台程序,需要以 extern “C” 包含的文件及引入工程的文件如下:

{lauxlib}.h/.c、{lua}.h/.c、lualib.h、luaconf.h,注释掉 lua.c 中的 main 函数,新建 main.lua 文件,代码就一条 print ("hello world."),记得新工程导入 dll 和 lib 文件,该工程的 main.cpp 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
extern "C" {
#include "lauxlib.h"
#include "lua.h"
#include "lualib.h"
}

#include <cstring>

int main() {
lua_State *lua = lua_open();
luaopen_base(lua);
luaopen_table(lua);
luaL_openlibs(lua);
luaopen_string(lua);
luaopen_math(lua);

if (luaL_loadfile(lua, "main.lua")) {
const char *error = lua_tostring(lua, -1);
printf("%s\n ִrun script file failed.", error);
return -1;
}

if (lua_pcall(lua, 0, 0, 0)) {
const char *error = lua_tostring(lua, -1);
printf("%s\n ִrun script file failed.", error);

return -1;
}
return 0;
}