使用C++代码获取Lua package.cpath & path

我正在编写的C++(使用Qt库)项目具有嵌入式的Lua 5.1子系统,该子系统被表示为 lua_State,为了设置外部Lua模块(.lua文件)和库(.dll.so文件,具体取决于操作系统)存储的位置,以便根据需要进行require,我需要操作全局package.pathpackage.cpath表成员。

我有一个可以使用C++代码成功设置这些条目的代码,我可以在嵌入式系统中看到结果。

但是,我无法从C++侧得到它们。目前,对于package.path,我有以下内容:

QString TLuaInterpreter :: getLuaPath()
{
    lua_State * L = pGlobalLua;如果(!L){
        qDebug()<< "LUA CRITICAL ERROR:在TLuaInterpreter :: getLuaPath中-找不到合适的Lua执行单元。";
        返回QString(" LUA临界错误");}

    lua_getglobal(L,“package.path”);
    lua_getfield(L,LUA_GLOBALSINDEX,“package.path”);
    QString result(QString :: fromUtf8(lua_tostring(L,1)));

    return result;
}

我期望有一个以 ;为分隔符的条目列表,例如:

./?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua;/usr/local/lib/lua/5.1/?.lua;/usr/local/lib/lua/5.1/?/init.lua;/usr/share/lua/5.1/?.lua;/usr/share/lua/5.1/?/init.lua.

但是我只得到一个空的QString返回。现在我不熟悉Lua,如同我熟悉C/C++一样,因此这可能是一个lua堆栈操作问题,但我确信我拥有正确的lua_State实例-那么这个方法有什么问题吗?

点赞
用户72944
用户72944

你不能直接使用 lua_getglobal(L, "package.path"),你必须先将 package 压入栈中,再将 path 压入栈中。

2017-12-23 16:13:41
用户12107786
用户12107786

好的,“cpath”是“package”表的一个字段。你应该使用类似这样的东西:

lua_getglobal(L, "package");
lua_getfield(L, -1, "cpath");
2019-09-23 14:07:55