加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

[Lua]Lua调用C/C++函数/库(动态链接方式)

发布时间:2020-12-14 22:02:02 所属栏目:大数据 来源:网络整理
导读:第一种方式 新建DLL空的win32工程,新建test.cpp文件,内容如下 /*Lua调用C/C++函数/库(动态链接方式)*/#includeiostreamusing namespace std;#includelua.hppstatic int math_abs(lua_State *L){ lua_pushnumber(L,abs((int)luaL_checknumber(L,1))); retur

第一种方式

新建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.comn");
    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文件输出

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读