您的位置:首页 > 编程语言 > Lua

Lua中调用C++

2020-02-29 21:10 405 查看

今年的年假格外的长,毕竟武汉的肺炎是格外可怕(生怕我一身的菜鸡本领还没咋发挥就惨死肺炎之下!),前两天更是青白江地震,不知道住那附近的麻神感想如何~感谢咱的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
于春节在家躲避武汉肺炎

  • 点赞
  • 收藏
  • 分享
  • 文章举报
冲锋的羊驼 发布了4 篇原创文章 · 获赞 0 · 访问量 58 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: