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

标签 lua luabind

我搜索并尝试了几天。问题是这样的:

我写了一个加载共享库的脚本 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) ,因为我不知道 Lua 脚本中会加载哪个 .so 库。

谢谢。

最佳答案

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

关于lua - 我的lua脚本加载.so库,如何用Lua 5.2编写宿主程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15893165/

相关文章:

字符串到数字的转换

c++ - 使用 Luabind 处理事件回调

c++ - 错误 : missing binary operator before token "("

c++ - Luabind 断言失败

python - 如何从 Lua 调用 Python 函数?

c++ - 制作 map 编辑器的语言/GUI库

types - 类型检查不适用于 Luau 中的通用字符串键?

c++ - Luabind undefined symbol /Luabind::scope::scope

c++ - 这个脚本会导致很多很多关闭吗?如果是,有什么替代方案?

python - 在 C 中嵌入 Tensorflow/Torch 以集成到更大的项目中