lua - 将 LuaJIT 模块嵌入 C 应用程序

标签 lua luajit

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

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

最佳答案

是的。

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 配方,否则您会看到一些令人困惑的错误!
  • 关于lua - 将 LuaJIT 模块嵌入 C 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19606543/

    相关文章:

    c++ - 与 gcc 静态链接时为 "Undefined reference to dlopen"

    lua - 如何设置zerobrane studio的环境变量

    ruby - Redis BRPOP 和 ZADD 原子化

    lua - 如何使用IntelliJ IDEA计算代码行(LOC)?

    ruby - 如果我非常喜欢 Ruby,我现在是否应该学习另一种语言,例如 Lua 或 Erlang?

    string - Luajit 相当于 string.pack 和 string.unpack?

    lua - 为什么 LuaJIT/Openresty 可以使用已弃用的 'arg' 语言功能?

    loops - Lua 尾调用 vs 循环

    lua - wxLua - 在 wxStaticText 控件中更改文本时需要动态重排

    lua - LuaJIT 的 FFI 可以像 JIT 那样被禁用吗?