我搜索并试了几天。问题是:
我编写了一个加载共享库locker.so
的脚本,它与lua解释器运行良好,但我无法写出正确的宿主程序。
我的lua脚本load_so.lua
非常简单:
locker = require("locker")
print(type(locker))
for k, v in pairs(locker) do
print(k, v)
end
我的主持人计划是:
int main(int argc, const char *argv[])
{
lua_State * L = luaL_newstate();
luaL_openlibs(L);
if (luaL_dofile(L, "load_so.lua") != 0) {
fprintf(stderr, "luaL_dofile error: %s\n", lua_tostring(L, -1));
lua_pop(L, 1);
}
lua_close(L);
return 0;
}
当我运行我的主机程序时,错误打印出来:
luaL_dofile error: error loading module 'locker' from file './locker.so':
./locker.so: undefined symbol: lua_pushstring
还有locker.c:
static int elock_get(lua_State * L) {...}
static int elock_set(lua_State * L) {...}
static const struct luaL_Reg lockerlib[] = {
{"get", elock_get},
{"set", elock_set},
{NULL, NULL}
};
int luaopen_locker(lua_State *L)
{
//luaL_newlib(L, lockerlib);
//lua_pushvalue(L, -1);
//lua_setglobal(L, LOCKER_LIBNAME);
//set_info(L);
luaL_newlibtable(L, lockerlib);
luaL_setfuncs(L, lockerlib, 0);
return 1;
}
大多数文章,书籍,问题都说明了如何在Lua 5.1中进行操作,是的,该程序在Lua 5.1中正确运行。但是我怎么能让它支持Lua 5.2,为什么呢?
P.S:我不想在我的C宿主程序中加载库luaL_requiref(L, "locker", luaopen_locker, 1)
,因为我不知道哪个.so库会在Lua脚本中加载。
感谢。
答案 0 :(得分:3)
在Linux中,如果您将liblua.a
静态链接到主程序中,则需要在链接时使用-Wl,-E
来导出Lua API符号;这就是标准命令行解释器的构建方式。