第一种方式
新建DLL空的win32工程,新建test.cpp文件,内容如下
/*Lua调用C/C++函数/库(动态链接方式)*/ #include<iostream> using namespace std; #include<lua.hpp> static int math_abs(lua_State *L) { lua_pushnumber(L,abs((int)luaL_checknumber(L,1))); return 1; } static int math_cos(lua_State *L) { lua_pushnumber(L,cos((double)luaL_checknumber(L,1))); return 1; } static int math_sin(lua_State *L) { lua_pushnumber(L,sin((double)luaL_checknumber(L,1))); return 1; } static const luaL_reg mathlib[] = { { "abs",math_abs },{ "cos",math_cos },{ "sin",math_sin },{ NULL,NULL } }; //dll通过函数luaI_openlib导出,然后lua使用package.loadlib导入库函数 extern "C" __declspec(dllexport) int LuaAPIDLL(lua_State* L)//需要注意的地方,此函数命名与库名一致 { luaI_openlib(L,"DY_MATH",mathlib,0); return 1; }
lualoadlib.lua文件
--region lualoadlib.lua local libpath="./../Debug/LuaAPIDLL.dll" local loadlibfunc=package.loadlib(libpath,"LuaAPIDLL") loadlibfunc() function COS(a) print("called COS in lua script") return DY_MATH.cos(a) end function SIN(a) print("called SIN in lua script") return DY_MATH.sin(a) end print(COS(60*3.1415926/180)) print(SIN(30)) os.execute("pause") --直接双击此文件,cmd窗口不会消失 --endregion直接双击lualoadlib.lua文件,结果如下
第二种方式
test.cpp部分代码
#include<iostream> using namespace std; #include<lua.hpp> static int testFunc(lua_State *L) { printf("http://www.jellthink.com\n"); lua_pushnumber(L,10); return 1; } static const struct luaL_Reg myLib[] = { {"test",testFunc},{NULL,NULL} }; extern "C" __declspec(dllexport) int luaopen_LuaAPIDLL(lua_State* L) { luaL_register(L,"testDll",myLib); return 1; } /* LUA 调用外部DLL,DLL 中包含库函数和抛出函数,当不是使用package.loadlib来使用外部DLL时, 而是使用另一种方式require,那么就需要注意一些规则: DLL中的抛出函数原型必须是: [extern "C" ] __declspec(dllexport) int luaopen_XXX(LuaState* L),而且XXX是DLL的文件名。[]是可选符号,而package.loadlib使用方式是不需要这些规则的,但是为了兼容性好,即:DLL可以同时使用以上两种方式使用,还是按规则命名抛出函数。 */test.lua文件要与LuaAPIDLL.dll文件在同一个目录中,内容如下
require "LuaAPIDLL" local a = testDll.test() print(a) os.execute("pause")双击,test.lua文件输出
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。