将LuaJIT模块嵌入C应用程序

在我的应用程序中,我已经从 C 后端暴露了所有的 Lua 库。现在,我需要加载一个 Lua 模块。方法如下:

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

这将搜索 package.path 来查找 <libname>.lua 并加载它。

是否有可能将 Lua 模块 内置 到 C 应用程序中(以便模块成为 C 应用程序的一部分)?这样我就不必单独打包 Lua 模块了。不知为何我找不到任何参考或示例!:(

注:我正在使用LuaJIT-2.0.2,并且涉及到的库是SciLua/Time(使用ffi)。

点赞
用户12048
用户12048

是的。

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.cModule.lua保持同步,例如通过Makefile配方,否则您将看到一些困惑的错误!
2013-10-26 12:44:48