【问题标题】:How can I build and link Lua core and few Lua modules in one .exe file如何在一个 .exe 文件中构建和链接 Lua 核心和几个 Lua 模块
【发布时间】:2011-12-27 14:19:07
【问题描述】:

我需要制作可在 Windows、Linux、MacOS 上运行且无需安装的便携式应用程序。它必须是一个可执行文件,并且没有其他库文件(.dll、.so ...)。我将使用 ANSI C 并为每个平台重新编译项目。我想使用 Lua 脚本,所以必须在我的代码中嵌入 Lua 解释器。我需要网络和其他一些模块来编写,但我现在 Lua 已经有用于此目的的模块,所以我将使用它们而不是编写我自己的模块。 如何将所有这些、Lua 解释器、Lua 模块(即 LuaSocks)链接到一个可执行文件中,该文件将加载 .lua 脚本。 Lua 有“require”系统,它期望 .dll 找到,所以我想知道我应该怎么做,只调用没有“require”语句的函数就足够了吗?

【问题讨论】:

    标签: build lua static-linking


    【解决方案1】:

    你肯定可以做到这一点(这并没有错!),虽然这不是微不足道的。 Lua 核心是为嵌入而设计的,以至于您可以将 Lua 源代码包含到您自己的项目中,并且它“正常工作” :)。

    处理与模块略有不同 - 其中没有多少适合直接嵌入。例如,之前已成功尝试过 LuaSocketasked here。基本思路是将MODULE的源码嵌入到你的项目中,将luaopen_MODULE函数插入到package.preload['MODULE']中,以便require以后可以取到。

    一种方法是查看已嵌入 Lua 和其他库的项目的来源,例如 LÖVEMurgaLuaScrupp

    如果无法实现没有外部库的单一可执行文件的目标,您可以放宽一点,选择 portable 应用程序 - 一个包含所有依赖项的应用程序,在一个目录中,独立于系统。这就是LuaDist 的设计目的——你使用它类似于 LuaRocks 来安装 Lua 包。不同之处在于,这些包可以安装/部署到一个单独的目录中,其中也安装了所有必要的依赖项。这个目录(“dist”)是完全独立的,这意味着你可以将它移到其他地方,它仍然可以工作。

    另外,我不喜欢需要安装的应用程序的想法(因为它会将文件放在我的系统周围)-卸载应该只是删除一个目录:)

    【讨论】:

    • 同样,您需要一个 lua 解释器(或 JIT 编译器)来使用应用程序提供的 lua 字节码。
    • 是的,这就是我在第一段中所说的 - 您可以将整个编译器和解释器包含到您的项目中。那是 Lua - 编译 200KB 的纯魔法 :)
    • 嗯,我认为我应该使用外部模块开发我的应用程序,然后尝试将所有内容嵌入到单个二进制文件中。重新编译和嵌入Lua核心没问题,只是模块,有点问题。
    • 感谢 LuaDist 的链接!我注意到他们有一个项目将捆绑单个 Lua 文件——这不是问题,但可以扩展。 github.com/LuaDist/srlua
    【解决方案2】:

    我相信你不能那样做(而且我认为那样做是错误的)。可执行文件是操作系统和机器特定的(在 MacOSX 等某些系统上,有fat binary 可执行文件,它们是相同操作系统的各种机器特定变体的混合体。)。

    拥有一个系统和机器“独立”程序的唯一方法本质上是将它定位到某个单一的通用“虚拟机”(在最广泛的意义上)。在您的情况下,这个 VM 是 Lua VM(它可能是其他人的 Java VM,等等)。但是您必须假设您的用户拥有它,或者提供一个特定于机器和系统的。

    我个人不喜欢无法安装的应用程序的想法(因为它不容易卸载)。

    【讨论】:

    • 未安装的应用程序不需要卸载。它应该可以通过简单地删除可执行文件来删除;或者,最多,如果它通过删除该目录在自己的空目录中创建一些文件。 或者,应用程序本身可以提供自己的“卸载”。
    • 也许我不清楚。我将使用 ANSI C 并为每个平台重新编译项目。只想拥有相同的来源。
    • 这应该很简单。你尝试了什么?您的应用程序可以是一组 C 文件 (*.c & *.h) 和一组 Lua 文件 (*.lua)。您需要一个 README(或者可能是 Makefile)来解释它应该如何构建和使用。将所有内容放在一个目录中。分发 tar 球或 .zip 存档。
    猜你喜欢
    • 2014-10-17
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    相关资源
    最近更新 更多