Связывание Lua с C ++ в Qt Creator - PullRequest
0 голосов
/ 01 мая 2018

В настоящее время я пытаюсь связать скрипт Lua с приложением C ++ хоста. Для моего скрипта Lua все, что у меня есть, это:

io.write(string.format("From Lua."));

Я использую Qt Creator для этого и пытаюсь вызвать скрипт следующим образом:

lua_State *state = luaL_newstate();
lua_call(state , 0 , 0);

Что постоянно дает мне ошибку PANIC: unprotected error in call to Lua API (attempt to call a string value).

Я пытался обернуть скрипт в функцию, подобную этой:

function main()

io.write(string.format("From Lua.With Progress"));


end

И затем вызывается с тем же кодом, что и раньше, но с добавлением:

lua_getglobal(state , "main");
lua_pcall(state , 0 , 0 , 0);

, который не дает ошибки, но:

lua_call(state , 0 , 0) 

дает ошибку PANIC: unprotected error in call to Lua API (attempt to call a nil value).

После дополнительных попыток устранения неполадок я обнаружил, что luaL_loadfile(state , "EngineRxer.lua") возвращает значение 7 вместо 0, поэтому я предполагаю, что сценарий не удалось загрузить в первую очередь.

Я также проверил свой рабочий каталог run в проектах Qt Creator -> Build and run -> run , и они находятся в том же каталоге, что и скрипт Lua.

Я сослался на:

Связывание Lua с Qt

Qt с Lua | Где разместить файлы lua

И даже некоторые форумы Qt:

http://www.qtcentre.org/threads/60693-Can-not-use-Lua-in-QtCreator

http://www.qtcentre.org/threads/62772-Lua-into-Qt

Кроме того, вероятно, важно упомянуть, как выглядит мой .pro-файл, все библиотеки Lua и его включения уже есть:

LIBS += \
/usr/local/Cellar/lua/5.3.4_3/lib/liblua.5.3.4.dylib

INCLUDEPATH += \
    /usr/local/Cellar/lua/5.3.4_3/include

Что еще более важно, после еще большего устранения неполадок я решил создать фиктивный тестовый проект для Netbeans (NonQt просто CML), и он работал и работал просто отлично. Даже если я попытаюсь создать фиктивную программу fstream для записи в пустой файл .txt, она не будет знать, где ее найти. Так что я подозреваю, что это проблема Qt Creator, но у меня все пути и каталоги сборки указаны для CWD.

1 Ответ

0 голосов
/ 01 мая 2018

У меня работает следующий фрагмент:

int main(int argc, char** argv)
{
    lua_State* L = luaL_newstate();
    luaL_openlibs(L);
    const char* script = "io.write(\"From Lua\")"; // or read the string from a user, file, etc.
    if(luaL_loadstring(L, script) || lua_pcall(L, 0, 0, 0))
    {
        //error occured
        const char* s = luaL_checkstring(L, -1);
        fprintf(stderr, "Error in script: %s", s);
        exit(EXIT_FAILURE);
    }
    lua_close(L);
    exit(EXIT_SUCCESS);
}

Вы не забыли позвонить luaL_openlibs и загрузить свой скрипт?

Не забудьте проверить возвращаемое значение из lua_load* и lua_pcall. Они разместят сообщение об ошибке в верхней части стека, которое вы можете прочитать и отобразить пользователю.

Также посмотрите документацию для luaL_loadfile :

Эта функция возвращает те же результаты, что и lua_load, но имеет дополнительный код ошибки LUA_ERRFILE, если она не может открыть / прочитать файл.

Глядя в заголовок lauxlib.h (для lua 5.3), мы видим, что LUA_ERRFILE равен LUA_ERRERR+1, который определен в lua.h как 6. Следовательно, LUA_ERRFILE равен 7 (в Lua 5.3; другие версии могут отличаться).

Следовательно, похоже, что вы не указали имя файла правильно, или сценарий не может быть прочитан. Попробуйте открыть файл с помощью QFile или std :: ifstream и распечатать его на консоли, чтобы убедиться, что вы правильно указали свои пути.

...