如何在一个.exe文件中构建和链接Lua核心和少量Lua模块

时间:2011-11-12 11:26:33

标签: build lua static-linking

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

2 个答案:

答案 0 :(得分:10)

你肯定可以做到这一点(并没有错!),尽管它并非无足轻重。 Lua核心是为嵌入而设计的,你可以将Lua源包含到你自己的项目中,并且“只是工作” :)。

这笔交易与模块略有不同 - 其中很多都不适合直接嵌入。例如,之前LuaSocket以及asked here已成功尝试过此操作。基本的想法是将MODULE的源代码嵌入到您的项目中,并将luaopen_MODULE函数插入到package.preload['MODULE']中,以便require可以在以后将其取出。

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

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

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

答案 1 :(得分:0)

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

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

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