千家信息网

Lua怎么调用C++的函数和库

发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,这篇文章主要讲解了"Lua怎么调用C++的函数和库",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Lua怎么调用C++的函数和库"吧!文章目录第一种方式
千家信息网最后更新 2025年02月02日Lua怎么调用C++的函数和库

这篇文章主要讲解了"Lua怎么调用C++的函数和库",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Lua怎么调用C++的函数和库"吧!

文章目录

  • 第一种方式

  • 第二种方式

第一种方式

新建DLL空的win32工程,新建test.cpp文件,内容如下

/*Lua调用C/C++函数/库(动态链接方式)*/#includeusing namespace std;#includestatic 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.lualocal 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)endfunction SIN(a)    print("called SIN in lua script")    return DY_MATH.sin(a)endprint(COS(60*3.1415926/180))print(SIN(30))os.execute("pause") --直接双击此文件,cmd窗口不会消失--endregion

直接双击lualoadlib.lua文件,结果如下

第二种方式

test.cpp部分代码

#includeusing namespace std;#includestatic 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文件输出

感谢各位的阅读,以上就是"Lua怎么调用C++的函数和库"的内容了,经过本文的学习后,相信大家对Lua怎么调用C++的函数和库这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

0