"требовать" не работать в коде луа

В этом коде я загружаю и запускаю test.lua файл

int main (){
    L = luaL_newstate();
    luaL_openlibs(L);
    luaL_dofile(L, "test.lua");
    lua_close(L);
    return 0;
}

содержимое моего файла test.lua

print ("s1");
r=require 'simple';
print ("s2");

simple модуль установлен раньше

когда беги ./lua_c; вывод только: s1

но когда беги lua test.lua; вывод

s1
s2

а также r в ноль

1 ответ

Решение

simple не удается загрузить или проанализировать или выполнить. Чтобы найти проблему, используйте luaL_loadfile вместо luaL_dofile и проверьте возвращаемое значение. Если не ноль, произошла ошибка загрузки, которую вы можете вытолкнуть из стека Lua и распечатать. Если нет ошибки, сделайте lua_pcall(L, 0, LUA_MULTRET, 0)) чтобы запустить патрон, созданный loadfile, и снова проверить код возврата на наличие ошибки, вытолкнуть стек и распечатать. Было бы что-то вроде этого:

int main ()
{
    L = luaL_newstate();
    luaL_openlibs(L);

    if (luaL_loadfile(L, "test.lua"))
    {
         cout << "Error: " << lua_tostring(L, -1) << endl;
    }
    else if (lua_pcall(L, 0, LUA_MULTRET, 0))
    {
         cout << "Error: " << lua_tostring(L, -1) << endl;
    }
    else
    {
         // call successful
    }

    lua_close(L);
    return 0;
}

Обновление: теперь, когда вы знаете из сообщения об ошибке, что simple.so имеет неопределенный символ: lua_gettop, вы знаете, что есть ошибка ссылки. возможно simple.so не связан с lua51.so, но так как он работает с lua.exe, который связан с lua lib, он будет работать с вашим приложением, которое, безусловно, также связано с ним. Другая возможность состоит в том, что lua.exe статически связан, но simple.so не связан. Подтвердите это simple.so связан с lua51.so, и его можно найти, например, через LD_LIBRARY_PATH, Убедитесь, что lua.exe связан с тем же.so.

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