Встраивание модуля LuaJIT в приложение C

В моем приложении у меня есть все библиотеки Lua, открытые из бэкэнда C. Теперь мне нужно загрузить модуль Lua. Метод для этого выглядит следующим образом:

lua_getglobal(L, "require");
lua_pushstring(L, libname);
lua_pcall(L, 1, 0, 0);

который будет искать package.path, чтобы найти <libname>.lua и загрузить его.

Можно ли встроить модуль Lua в приложение C (чтобы модуль стал частью приложения C)? так что мне не нужно отдельно упаковывать модуль Lua. Почему-то я не могу найти никаких ссылок или примеров этого! :(

p.s. Я использую LuaJIT-2.0.2, а рассматриваемая библиотека - SciLua/Time (использует ffi)


person vyom    schedule 26.10.2013    source источник
comment
возможный дубликат Запуск объектного файла luajit из C   -  person Mike Pall    schedule 26.10.2013


Ответы (1)


да.

luajit -b Module.lua Module_bc.c

скомпилирует модуль в байт-код и выведет инициализатор массива C, содержащий этот байт-код. Если вы соберете с включенными общими библиотеками и экспортируете этот массив из основного исполняемого файла, require найдет его (и не нужно будет искать Module.lua.)

Чтобы проверить, работает ли он, установите package.path = "" перед requireмодулем. Если это все еще работает, вы знаете, что предварительная загрузка работает, а не просто использует файл Module.lua из текущего каталога.

http://luajit.org/running.html

Другие вещи, которые следует иметь в виду:

  • Если модуль зависит от внешнего файла (используя io.open), этот файл все равно должен присутствовать. Например, некоторые модули ffi пытаются открыть заголовочный файл C, чтобы перейти к ffi.cdef.
  • Вам нужно синхронизировать Module_bc.c с Module.lua, например. с рецептом Makefile, иначе вы увидите несколько запутанных ошибок!
person finnw    schedule 26.10.2013
comment
Я понял идею, и я также видел другой пост, на который ссылался Майк. Но в своем приложении я не собираюсь использовать общие библиотеки. Насколько я понимаю, мне нужен сгенерированный luajit массив BC, и мне нужно сделать package.preload, но я не хочу, чтобы скрипты вызывали require, поэтому мне также нужно сделать lua_getglobal(L, "require");lua_pushliteral(L, "module") на Состояние Луа. правильный? - person vyom; 27.10.2013
comment
Если вы не хотите, чтобы сценарий вызывал require, вам также потребуется сохранить объект модуля в глобальной таблице. И, возможно, используйте luaL_loadbuffer вместо require. И создайте файл .h вместо файла .c из luajit -b, потому что версия .h включает поле длины, а версия .c — нет (и вам нужна длина для передачи в luaL_loadbuffer). - person finnw; 27.10.2013