【问题标题】:Embedding LuaJIT module into C application将 LuaJIT 模块嵌入 C 应用程序
【发布时间】:2013-10-26 12:11:12
【问题描述】:

在我的应用程序中,我拥有从 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

【问题讨论】:

标签: lua luajit


【解决方案1】:

是的。

luajit -b Module.lua Module_bc.c

会将模块编译为字节码并输出包含该字节码的 C 数组初始值设定项。 如果您在启用共享库的情况下构建并从主可执行文件中导出此数组,require 会找到它(并且不需要查找Module.lua。)

要测试它是否正常工作,请在require 模块之前设置package.path = ""。如果它仍然有效,则您知道预加载正在工作,并且不只是使用当前目录中的 Module.lua 文件。

http://luajit.org/running.html

其他注意事项:

  • 如果模块依赖于外部文件(使用io.open),该文件仍然需要存在。例如一些 ffi 模块尝试打开一个 C 头文件,传递给ffi.cdef
  • 您需要使Module_bc.cModule.lua 保持同步,例如使用 Makefile 配方,否则您会看到一些令人困惑的错误!

【讨论】:

  • 我明白了,我也看到了 Mike 提到的另一篇文章。但在我的应用程序中,我不打算使用任何共享库。所以,我的理解是,我需要luajit生成的BC数组,我需要做package.preload,但我希望脚本调用require,所以我也需要在 Lua 状态下做lua_getglobal(L, "require");lua_pushliteral(L, "module")。对吗?
  • 如果您不希望脚本调用require,您还需要将模块对象存储在全局表中。也许使用luaL_loadbuffer 而不是require。并从luajit -b 生成.h 文件而不是.c 文件,因为.h 版本包含长度字段但.c 版本不包含(并且您需要将长度传递给luaL_loadbuffer。 )
猜你喜欢
  • 2011-08-20
  • 2011-11-22
  • 1970-01-01
  • 2012-10-18
  • 1970-01-01
  • 2022-11-09
相关资源
最近更新 更多