来公司一年多了,一直在用lua做开发。公司有封装好的lua接口,没有源码,所以只能自己研究相关接口的大概原理。
关于lua模块,网上有很多博文,大概的实现方式无外乎是,在单独的lua文件定义一个table,然后通过return 返回。用的时候通过require 加载。这样可行,但是有点繁杂。
我们知道模块是通过table方式存在。可以通过把table注册到全局表,在需要用到的地方再取出,这就很方便了
简单实现,直接修改lua源码,封装两个接口。在lbaselib.c中添加以下代码:
static int lua_GetGlobalObject(lua_State *L)
{
const char *name = luaL_checkstring(L,-1);
lua_getglobal(L,name);
return 1;
}
static int lua_SetGlobalObject(lua_State *L)
{
int argCount = lua_gettop(L);
const char *name = luaL_checkstring(L,-2);
lua_setglobal(L,name);
return 1;
}
修改数组:
static const luaL_Reg base_funcs[] = {
{"assert", luaB_assert},
{"collectgarbage", luaB_collectgarbage},
{"dofile", luaB_dofile},
{"error", luaB_error},
{"getmetatable", luaB_getmetatable},
{"ipairs", luaB_ipairs},
{"loadfile", luaB_loadfile},
{"load", luaB_load},
{"SetGlobalObject", lua_SetGlobalObject},
{"GetGlobalObject", lua_GetGlobalObject},
。。。。。。。
}
然后重新编译,生成静态库。这样在lua代码中就可以使用SetGlobalObject,GetGlobalObject两个接口。
新建两个lua模块,moduleA.lua
local moduleA = {}
function moduleA.Add(va,vb)
print("enter module A function")
return va + vb
end
SetGlobalObject("myModuleA",moduleA)
local tb = GetGlobalObject("myModuleB")
local ret = tb.Sub(9,7)
print("ret",ret)
-----------------------------------------moduleB.lua-------------
local moduleB = {}
function moduleB.Sub(va,vb)
print("enter module B sub function")
return va - vb
end
SetGlobalObject("myModuleB",moduleB)
----------main.cpp------------------
void main()
{
lua_State *L = luaL_newstate();
luaL_openlibs(L);
luaL_dofile(L,"D:/source/LuaCppTest/LuaCppTest/Debug/moduleB.lua");
luaL_dofile(L,"D:/source/LuaCppTest/LuaCppTest/Debug/moduleA.lua");
lua_close(L);
system("pause");
}