创建独立的Lua可执行文件

41

有没有一种简单的方法可以从Lua脚本创建独立的.exe文件?基本上这将涉及链接Lua解释器和脚本。

我相信这是可能的(PLT Scheme以同样的方式允许创建独立的可执行文件),但具体怎么做呢?

7个回答

32

请查看srlua。它可以满足您的需求。

这是Lua作者之一开发的工具。该网址还提供了预编译的 Windows 二进制文件,这样对您来说会更加方便。


很遗憾,srlua对我来说没有用。下面使用luac/bin2c的解决方案起作用了。 - Zane
1
srlua在他们的github存储库中分发二进制文件- https://github.com/LuaDist/srlua 这些对我来说工作得相当不错 - glue.exe srlua.exe my.lua my.exe - noahp

10
使用bin2c工具将脚本转换为可执行文件的方法如下:

luac script.lua -o script.luac
bin2c script.luac > code.c

然后在文本编辑器中创建main.c文件,并使用您喜欢的编译器进行编译/链接。就这样。(注意-可执行文件还支持命令行参数)

MSVC示例:

cl /I "./" /I "$(LUA_DIR)\include" /D "_CRT_SECURE_NO_DEPRECATE" /D "_MBCS" /GF /FD /EHsc /MD /Gy /TC /c main.c
ld /SUBSYSTEM:CONSOLE /RELEASE /ENTRY:"mainCRTStartup" /MACHINE:X86 /MANIFEST $(LUA_DIR)\lib\lua5.1.lib main.obj /out:script.exe
mt -manifest $script.manifest -outputresource:script.exe;1

使用/SUBSYSTEM:WINDOWS来创建GUI可执行文件。 如果第一次操作不太容易,你可以创建批处理文件来自动化这个过程,一旦你成功尝试过。

main.c:

#include <stdlib.h>
#include <stdio.h>
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"

int main(int argc, char *argv[]) {
  int i;
  lua_State *L = luaL_newstate();
  luaL_openlibs(L);
  lua_newtable(L);
  for (i = 0; i < argc; i++) {
    lua_pushnumber(L, i);
    lua_pushstring(L, argv[i]);
    lua_rawset(L, -3);
  }
  lua_setglobal(L, "arg");
#include "code.c"
  lua_close(L);
  return 0;
}

4
请注意,bin2c已在Lua 5.1中取消,因此您需要另一种方式来打包字节码并将其放入Lua堆栈中。请参阅http://lua-users.org/wiki/BinToCee,在Lua中重新实现它。 - Charles Stewart

7
除了上述建议,你还可以查看 L-Bia。 它可以制作包括lua脚本和所需动态库在内的独立可执行文件。

6
截至2018年, luastatic 是一款正在积极维护的工具,它能够实现这个功能。而被采纳答案中提到的 srlua 和本页面上的其他工具似乎没有得到维护。

那么,有没有工具可以:
  1. 自动查找所有需要的包和DLL文件,然后将它们全部复制?
  2. 将Lua源文件打包成EXE文件,以便对源代码进行低级别保护。
就像pyinstaller所做的那样。有这样的软件吗?谢谢。
- oyster

4
由于您提到'.exe',我假设您正在寻找Windows解决方案。一个想法是将脚本附加到预先构建的解释器可执行文件中。它在您的书中可能或可能不被视为“容易”。
解释器需要能够读取自身,解析其头文件以确定常规.exe数据结束的位置(即脚本开始的位置),然后将文件余下的部分移交给Lua。
其他解决方案不需要解释器工作得如此辛苦,但需要更复杂的链接,而采用这种方法,使脚本成为可执行文件可以像以下那样简单:
copy interpreter.exe+script.lua script.exe

0

由于这个话题具有某种“永恒”的兴趣,而可能的答案在新的解决方案出现(旧的解决方案可能会过时)的意义上是“流动的”,因此这里提供了另一种可能性(适用于Windows),以及纯Lua源代码依赖项。

链接:Windows控制台实用程序,可将Lua源代码及其Lua源代码依赖项一次性转换为C文件,准备进行编译。

注意:除非其他平台的字节码存在差异,否则生成的C代码应该能够在任何可以编译原始Lua源代码并创建Lua应用程序的独立本机二进制文件的平台上编译。


0

这里有一个简单的方法:

  1. http://luabinaries.sourceforge.net/下载lua的二进制文件
  2. 解压该文件,并在同一文件夹中创建一个app.lua文件
  3. 按下WIN键加R打开运行,然后输入iexpress
  4. 在iexpress中选择创建新的自解压指令文件并点击下一步
  5. 选择提取文件并运行安装命令,然后点击下一步
  6. 给你的应用程序命名。选择不提示和不显示许可证,然后当它要求你选择一个文件时,选择你的app.lua和那些lua二进制文件所在的文件夹
  7. 全选并点击下一步。在安装程序类型中输入"lua54.exe app.lua"(不包括引号)。
  8. 在显示窗口中选择默认,在完成消息中选择无消息。在软件包名称和选项中,点击浏览并输入你的exe文件名,然后选择隐藏提取进度并使用长文件名存储文件
  9. 选择不重启,然后你可以选择保存sed文件或不保存
  10. 点击下一步,再次点击下一步,它将生成一个exe文件,你可以双击运行该应用程序。
  11. 缺点:人们可以通过将文件重命名为.exe之后的.zip来轻松找到你的源代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接