7

在我的应用程序中,我拥有从 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模块了。不知何故,我无法找到任何参考或示例!:(

ps我正在使用LuaJIT-2.0.2,有问题的库是SciLua/Time(使用ffi

4

1 回答 1

6

是的。

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 配方,否则您会看到一些令人困惑的错误!
于 2013-10-26T12:44:48.210 回答