首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt Creator中的Lua与C++的连接

Qt Creator中的Lua与C++的连接
EN

Stack Overflow用户
提问于 2018-05-01 00:43:16
回答 1查看 1K关注 0票数 2

目前,我正在尝试将Lua脚本链接到主机C++应用程序。对于我的Lua剧本,我只有:

代码语言:javascript
复制
io.write(string.format("From Lua."));

为此,我使用了Qt创建者,并试图像这样调用脚本:

代码语言:javascript
复制
lua_State *state = luaL_newstate();
lua_call(state , 0 , 0);

这一直给我一个PANIC: unprotected error in call to Lua API (attempt to call a string value)错误。

我尝试过用这样的函数包装脚本:

代码语言:javascript
复制
function main()

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


end

然后使用与前面相同的代码调用它,但添加如下:

代码语言:javascript
复制
lua_getglobal(state , "main");
lua_pcall(state , 0 , 0 , 0);

这不会产生错误,但是:

代码语言:javascript
复制
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,所以我假设脚本一开始就没有加载。

我还检查了directory项目中的运行工作目录、->构建和运行->run,它们与Lua脚本位于同一个目录中。

我提到过:

将Lua与Qt连接起来

Qt与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库和包含都已经在其中了:

代码语言:javascript
复制
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 on ),它运行并正常工作。即使我尝试制作一个虚拟的fstream程序来写入一个空的.txt文件,它也不知道在哪里找到它。因此,我怀疑这是directories问题,但我有我所有的路径和构建目录指向CWD。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-01 13:02:36

下面的片段适用于我:

代码语言:javascript
复制
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的返回值。它们将在堆栈顶部放置一条错误消息,您可以将其读取并显示给用户。

还请参阅加载文件的文档:

这个函数返回与lua_load相同的结果,但是如果它不能打开/读取文件,它有一个额外的错误代码LUA_ERRFILE。

lauxlib.h头(对于Lua5.3)中,我们看到LUA_ERRFILE等于LUA_ERRERR+1,在lua.h中定义为6,因此LUA_ERRFILE等于7(在Lua5.3中;其他版本可能有所不同)。

因此,您似乎没有正确地指定文件名,否则脚本就无法读取。尝试使用QFile或std::ifstream打开文件,并将其打印到控制台,以确保您正确地指定了路径。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50110024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档