今年的年假格外的长,毕竟武汉的肺炎是格外可怕(生怕我一身的菜鸡本领还没咋发挥就惨死肺炎之下!),前两天更是青白江地震,不知道住那附近的麻神感想如何~感谢咱的ZXTD公司,又延长了一周。
废寝忘食研究下个项目关于脚本的灵活开发方向时(前两天整到晚上两三点,差点把我要好的普通流感给整严重了,吓得这两天不到12点就睡觉),遇到反向在Lua中调用C++模块,然后出各种奇怪的问题,所以在此mark下。
本人的IDE是vs2017+vsCode
首先必须生成Dll,是的,Lua只识别Dll,别搞静态库,不支持的~
vs2017直接新建个空项目,项目中加入Lua的支持,改成生成Dll,为了方便可以把生成目标文件名写下,与你将要导出的最终函数中luaopen_XXX的"XXX"一致即可。
然后建立个cpp文件就开写:
#include<lua.hpp>
#include<string>
#include<vector>
using std::vector;
using std::string;
//目标函数1
static int addFunc(lua_State*L) {
double a = luaL_checknumber(L, 1);
double b = luaL_checknumber(L, 2);
auto c{ a * 2 + b };
lua_pushnumber(L, c);
return 1;
}
//目标函数2
static int subFunc(lua_State*L) {
double a = luaL_checknumber(L, 1);
double b = luaL_checknumber(L, 2);
auto c{ a - b };
lua_pushnumber(L, c);
return 1;
}
//是的,我这里试过了,vector是可行的!比原始的C数组安逸多了,美滋滋~~~
//函数格式化入容器
static const vector<luaL_Reg> ve{
{"add",addFunc},
{"sub",subFunc},
{nullptr,nullptr}
};
//这里是唯一的需要导出的函数,函数名必须是luaopen_开头
__declspec(dllexport) int luaopen_theDll(lua_State*L) {
luaL_newlib(L,&ve[0]);
return 1;
}
然后建立个资源文件.def,导入刚刚手打的导出函数
LIBRARY
EXPORTS
luaopen_theDll
嗯嗯,生成ing…
好了,dll准备完毕,丢到你想丢的位置去~
接下来是vsCode的Lua,注意咯,记得要在package.cpath中加入你丢dll的地方(不是path!不是path!不是path!),然后就可以愉快的获得模块了:
package.cpath=";;"..package.cpath.."/../temp/?.dll"
local tab=require("theDll")
v=tab.add(10.1,5.5)
v2=tab.sub(10.8,2.4)
print(v,v2)
Zr
2020-02-05
于春节在家躲避武汉肺炎