【问题标题】:Creating standalone Lua executables创建独立的 Lua 可执行文件
【发布时间】:2010-09-16 17:01:00
【问题描述】:

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

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

【问题讨论】:

    标签: windows lua


    【解决方案1】:

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

    它来自 Lua 作者之一。在这个地址上还有预编译的 Windows 二进制文件,所以我认为这对你来说会更容易。

    【讨论】:

    • 很遗憾,srlua 对我不起作用。下面使用 luac/bin2c 的解决方案有效
    • srlua 在他们的 github 存储库中分发二进制文件-github.com/LuaDist/srlua 这些对我来说效果很好-glue.exe srlua.exe my.lua my.exe
    【解决方案2】:

    使用 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
    

    对 GUI 可执行文件使用 /SUBSYSTEM:WINDOWS。 所有这一切都不是第一次,您可以创建批处理文件以在您成功尝试后自动执行该过程。

    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;
    }
    

    【讨论】:

    • 请注意 bin2c 在 Lua 5.1 中被删除,因此您需要另一种方法来打包字节码并将其放入 Lua 堆栈中。请参阅 lua-users.org/wiki/BinToCee 以了解在 Lua 中的重新实现。
    【解决方案3】:

    除了以上建议,你可以看看L-Bia

    它可以制作独立的可执行文件,包括 lua 脚本和所需的动态库。

    【讨论】:

      【解决方案4】:

      截至 2018 年,luastatic 是一个积极维护的工具,可以执行此操作。已接受答案中的 srlua 和此页面上的其他工具似乎未维护。

      【讨论】:

      • 那么,有没有什么工具可以 1. 找到所有需要的包和 DLL,然后自动复制它们? 2.将Lua源文件打包成EXE,对源代码有低级保护。就像pyinstaller 所做的一样。那么软吗?谢谢
      【解决方案5】:

      既然您说“.exe”,我假设您正在寻找 Windows 解决方案。一种想法是将脚本附加到预构建的解释器可执行文件中。在您的书中,它可能会或可能不会被称为“简单”。

      解释器需要能够读取自己,解析其头部以确定常规 .exe 数据的结束位置(即脚本开始的位置),然后将文件的其余部分交给 Lua。

      其他解决方案不需要解释器努力工作,但需要更多涉及的链接,而使用这种方法,执行脚本可以很简单

      copy interpreter.exe+script.lua script.exe
      

      【讨论】:

        【解决方案6】:

        由于这个主题具有某种“永久”的兴趣,并且可能的答案是“流动的”,因为新的解决方案可能会出现(而旧的解决方案可能会过时),这里还有另一种可能性(对于 Windows)和纯 Lua 源依赖项.

        链接:Windows console utility to convert in a single step a Lua source with its Lua source dependencies into a C file ready for compilation.

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-04-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-17
          • 2011-05-26
          • 1970-01-01
          • 2012-03-31
          相关资源
          最近更新 更多