如何将Lua脚本编译成单个可执行文件,同时仍然获得快速的LuaJIT编译器?

nic*_*ckb 39 lua compilation nginx luajit

如何将Lua脚本编译成单个可执行文件,同时还能获得LuaJIT的超快性能优势?

背景:

  • 我的Lua脚本用于我创建的Web应用程序(例如,托管http://example.com)
  • 我目前的技术堆栈是NGINX(网络服务器),Lua/LuaJIT(检索动态内容的语言)
  • 我有大约50多个.lua组成我的Web应用程序的文件(来自模型/视图/控制器)
  • FreeBSD 9操作系统

为了简化部署,我想将运行我的Web应用程序的所有.lua脚本编译成单个可执行文件.

  1. 这可能吗?怎么样?

    似乎Lua官方附带了一个名为SRLua的库

  2. 将我的.lua编译成单个可执行文件会有什么负面影响(例如性能会变差等等)?

小智 83

将所有Lua源代码文件转换为目标文件并将它们放在静态库中:

for f in *.lua; do
    luajit -b $f `basename $f .lua`.o
done
ar rcus libmyluafiles.a *.o
Run Code Online (Sandbox Code Playgroud)

然后使用将libmyluafiles.a库链接到主程序-Wl,--whole-archive -lmyluafiles -Wl,--no-whole-archive -Wl,-E.

此行强制链接器包含存档中的所有目标文件并导出所有符号.

例如,现在可以local foo = require("foo")在应用程序中加载名为foo.lua的文件.

有关该-b选项的详细信息可以在Running LuaJIT找到.

  • 嗬!来自LuaJit的Mike Pall回答了这个问题:) (20认同)
  • 非常感谢你在LuaJIT上的所有工作!你所做的事真的不可思议. (13认同)