Получение Lua package.cpath и пути с кодом C++

Проект С++ (с использованием Qt libs), для которого я кодирую, имеет «встроенную» подсистему Lua 5.1, которая представлена, как я понимаю, lua_State; чтобы указать, где хранятся внешние модули Lua (файлы .lua) и библиотеки (файлы .dll или .so в зависимости от ОС), чтобы их можно было required использовать по мере необходимости, мне нужно манипулировать глобальными элементами таблицы package.path и package.cpath.

У меня есть код, который может успешно устанавливать эти записи с кодом C++, и я вижу результаты во встроенной системе.

Однако я не могу получить их со стороны С++. В настоящее время для package.path у меня есть следующее:

QString TLuaInterpreter::getLuaPath()
{
    lua_State* L = pGlobalLua;
    if (!L) {
        qDebug() << "LUA CRITICAL ERROR: in TLuaInterpreter::getLuaPath - no suitable Lua execution unit found.";
        return QString("LUA CRITICAL ERROR");
    }

    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 - так что же не так в этом методе?


person SlySven    schedule 22.12.2017    source источник


Ответы (2)


Вы не можете lua_getglobal(L, "package.path") сразу, вы должны сначала получить package в стеке, а затем path.

person Vadim Peretokin    schedule 23.12.2017

Итак, «cpath» — это поле таблицы «package». Вы должны использовать что-то вроде этого:

lua_getglobal(L, "package");
lua_getfield(L, -1, "cpath");
person ibrahymous    schedule 23.09.2019