С++ и Lua регистрируют пользовательскую библиотеку lua во время выполнения

В настоящее время я пытаюсь внедрить LUA в свою программу CPP, однако у меня возникла следующая проблема: у меня есть библиотека на lua, скажем, lib.lua, которую я хотел бы запустить во время выполнения, чтобы другие сценарии lua могли получить к ней доступ. У меня проблемы с этим, вот мой код:

    /* initialize Lua */
    L = luaL_newstate();

    /* load Lua base libraries */
    luaL_openlibs(L);

    /* add my path to package.path */
    luaL_dostring(L, "package.path = 'D://Game.Helper/Lua/libs/?.lua;'..package.path ");        

    /* require my the library */
    luaL_dostring(L, "_G class = require 'middleclass'");
    ^^^ THIS IS CURRENTLY THE CODE NOT WORKING ^^^

    /* load the script */
    luaL_loadfile(L, "d://Game.Helper/Lua/scripts/test.lua");

    lua_call(L, 0, 0);
    
    // clean it up
    lua_close(L);

скрипт загружается правильно, однако, если мне не нужна моя библиотека в самом скрипте, он вернет для нее нулевое значение

Любая помощь приветствуется, спасибо!


person CheekyLewb    schedule 16.12.2020    source источник


Ответы (1)


В Lua, когда вы объявляете переменную как local, она доступна только в этой лексической области видимости. Вы сделали local class = require 'middleclass' в одном файле, а затем попытались использовать class в другом файле, у которого есть своя область действия. Вам нужно либо избавиться от local, чтобы вместо этого class была глобальной переменной, либо переместить эту строку в файл, который будет использовать class.

person Joseph Sible-Reinstate Monica    schedule 16.12.2020
comment
Понял, спасибо за ответ, я удалил loader.lua и смог отредактировать путь к пакету, используя: luaL_dostring(L, package.path = 'D://Game.Helper/Lua/libs/?.lua;'. .package.path ); Это позволяет мне идеально использовать мою библиотеку локально в моих сценариях, как бы я ни пытался это сделать: luaL_dostring(L, _G class = require 'middleclass'); перед загрузкой моего скрипта, и они не распознают средний класс, если я не объявлю его локально с помощью require , есть ли для этого причина? - person CheekyLewb; 16.12.2020
comment
@CheekyLewb Вы имели в виду _G.class вместо _G class? - person Joseph Sible-Reinstate Monica; 16.12.2020
comment
Вы гений, спасибо! это исправило мою проблему! - person CheekyLewb; 16.12.2020