编写Lua调用C/C++库的动态库文件
编写Lua调用C/C++的接口
环境:VS2017 commity 、Lua3.4
在VS2017中创建一个空项目,项目MyUtil。
鼠标右键项目,配置选“所有配置”,平台选“所有平台”。
常规:
输出目录:$(SolutionDir)..\bin\$(Platform)\$(Configuration)\
中检目录:$(SolutionDir)..\bintemp\$(Platform)\$(ProjectName)\$(Configuration)\
项目默认值中,配置类型选“动态库(.dll)”
我将下载好的lua源码和这个项目放在同一个目录下,luasrc是所有lua源码。
在项目中,添加interface.cpp文件,文件中的代码。
1 #include <windows.h> 2 //使用 lua标准头文件 3 #include "../luasrc/lua.hpp" 4 5 //累计传入参数的和 6 static int util_sums(lua_State *L) { 7 int number = lua_gettop(L);//获取参数个数 8 9 lua_Number sum = 0.0;//定义累计值 10 for (int i = 1; i <= number; ++i) { 11 if (!lua_isnumber(L, i)) {//第i参数 12 lua_pushliteral(L, "参数有错"); 13 lua_error(L);//抛出异常 14 } 15 sum += lua_tonumber(L, i);//将第i个参数转换为浮点数,加到sum上 16 } 17 lua_pushnumber(L, sum);//将累计值压入栈 18 lua_pushstring(L, "爱白菜的小昆虫");//再压个字符串进栈 19 return 2;//返回值的个数 20 } 21 22 //定义注册表 23 static const luaL_Reg util[] = { 24 // lua使用的名字,这里的函数名字 25 {"xqlSums", util_sums}, 26 {NULL, NULL} 27 }; 28 29 //以C语言方式导出luaopen_MyUtil函数 30 extern "C" __declspec(dllexport) 31 int luaopen_MyUtil(lua_State *L) {//函数接口规则:luaoepn_编译的库名字 32 luaL_newlib(L, util);//将函数名和函数注册 33 return 1; 34 }
鼠标右键项目,点击链接器->常规->附加库目录。
$(SolutionDir)..\bin\$(Platform)\$(Configuration)\;%(AdditionalLibraryDirectories)
点击链接器->输入->附加依赖项:luadll.lib(自己拿到lua源码编译的动态库,生成之后的lib文件。)
将项目编译生成动态库文件。
使用VS 2017的开发人员命令提示符,到生成的目录,使用
dumpbin /exports MyUtil.dll 查看是否导出函数
在库目录下,新建一个txt文件,修改名字为test.lua
lua代码
local obj = require("MyUtil")
print(obj.xqlSums(1, 2, 3, 4, 5, 6))
在命令行中,用lua解析器执行test.lua