Мой скрипт lua загружает библиотеку.so, как я могу написать хост-программу с Lua 5.2?

Я искал и пытался в течение нескольких дней. Проблема заключается в следующем:

Я написал скрипт, который загружает общую библиотеку locker.so, он хорошо работает с интерпретатором 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 и почему?

PS: я не хочу загружать библиотеку в моей программе на C, как luaL_requiref(L, "locker", luaopen_locker, 1), потому что я не знаю, какая библиотека.so будет загружаться в сценарии Lua.

Благодарю.

1 ответ

Решение

В Linux, если вы ссылаетесь liblua.a статически в вашей основной программе, вы должны использовать -Wl,-E при связывании экспортировать символы Lua API; так устроен стандартный интерпретатор командной строки.

Другие вопросы по тегам