Ответ 1
Это очень просто.
Сначала вы загружаете Lua script без его выполнения. Не имеет значения, подключили ли вы состояние Lua к экспортированным функциям; все, что вы делаете, это компиляция файла script.
Вы можете использовать luaL_loadfile
, который использует функции библиотеки C-стандарта для чтения файла с диска и загрузки его в lua_State
. Кроме того, вы можете загрузить файл самостоятельно в строку и использовать luaL_loadstring
, чтобы загрузить его в lua_State
.
Обе эти функции будут выдавать возвращаемые значения и ошибки компилятора в соответствии с документацией для lua_load
.
Если компиляция прошла успешно, lua_State
теперь имеет скомпилированный фрагмент Lua как функцию Lua в верхней части стека. Чтобы получить скомпилированный двоичный файл, вы должны использовать функцию lua_dump
. Это довольно сложно, поскольку он использует интерфейс обратного вызова для передачи вам данных. Подробнее см. .
После этого процесса у вас есть скомпилированный код байта Lua. Перетащите это в файл по вашему выбору. Просто запомните: напишите его как двоичный, а не с переводом текста.
Когда наступает время для загрузки байтового кода, все, что вам нужно сделать, это... точно, что вы делали до. Ну, почти. У Lua есть эвристика, чтобы обнаружить, что "строка", которую она задает, является исходной строкой Lua или байтовым кодом. Итак, да, вы можете загрузить байт-код с помощью luaL_loadfile
, как и раньше.
Разница в том, что вы не можете использовать luaL_loadstring
с байтовым кодом. Эта функция ожидает строку с нулевым завершением, что плохо. Байт-код может содержать встроенные NULL-символы, что бы повредить все. Поэтому, если вы хотите сделать файл IO самостоятельно (потому что вы используете специальную файловую систему или что-то еще), вам нужно напрямую использовать lua_load
. Который также использует интерфейс обратного вызова, например lua_dump
. Итак, прочитайте, как его использовать.