在 Qt Creator 中将 Lua 与 C++ 连接起来

目前,我正在试图将一个 Lua 脚本与宿主 C++ 应用程序连接起来。对于我的 Lua 脚本,我只有以下内容:

io.write(string.format("来自 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("来自 Lua。带有进展"));

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,因此我认为脚本在第一次加载时失败了。

我还检查了 Qt Creator 中运行工作目录的 _projects -> Build and run ->run_,它们与 Lua 脚本在同一个目录中。

我参考了以下内容:

在 Qt 中链接 Lua

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

另外,更重要的是,经过更多的故障排除,我决定在 Netbeans 上制作一个虚拟测试项目(非 Qt,只有 CML),它可以正常运行和工作。即使我尝试制作一个虚拟 fstream 程序来写入一个空的 .txt 文件,它也不知道该去哪里找它。因此,我怀疑这是一个 Qt Creator 的问题,但我已经将所有路径和构建目录指向 CWD。

点赞
用户3349368
用户3349368

以下代码段对我有用:

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_ERRERRlua.h中定义为6。因此,在Lua 5.3中,LUA_ERRFILE等于7(其他版本可能有所不同)。

因此,看起来你没有正确指定文件名,或者脚本无法读取。尝试用QFile或std::ifstream打开文件并将它打印到控制台,以确保你正确指定路径。

2018-05-01 13:02:36