我的Lua脚本加载了.so库,我该如何使用Lua 5.2编写宿主程序?

我搜索和尝试了几天,问题在于:

我编写了一个加载共享库 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:我不想像 luaL_requiref(L, "locker", luaopen_locker, 1) 一样在我的 C 宿主程序中加载库,因为我不知道哪个 .so 库将在 Lua 脚本中加载。

谢谢。

点赞
用户107090
用户107090

在 Linux 中,如果你将 liblua.a 静态链接到你的主程序中,你需要使用 -Wl,-E 进行链接以导出 Lua API 符号;这就是标准命令行解释器的构建方式。

2013-04-09 11:20:35