如何将 Linux 和 Windows 的文件打包成一个可执行文件?

How to pack files into one executable file for Linux and Windows?

我正在使用 Muon UI(使用 Ultralight 而不是 Chromium)在 Golang 上创建一个桌面应用程序,并为 Linux 和 Windows 交叉构建我的应用程序。目前该应用程序运行良好,但它需要 Ultralight 库(*.dll 用于 Windows 和 *.so 用于 Linux)。但我想将我的应用程序作为单个可执行文件分发。如何创建两个可执行文件? Linux 的第一个文件,它应该包括 Linux 的主要可执行文件和仅 *.so 库。第二个文件应包括 Windows 的主要可执行文件和仅 *.dll 库。我该怎么做?
是否有任何 CLI 实用程序? (例如在 Docker 中的 gitlab CI 中使用)或者我可以通过 Golang 来做到这一点(例如使用嵌入包。我可以将库嵌入到 exe 文件中吗,它可以 运行)?
或者我可以将 cgo 用于 link 动态库作为静态二进制文件吗?

诚实的回答是:“非常困难,很多痛苦,流血和流泪。”

稍微长一点的答案是,预编译的 DLL/.so 可能包含的不仅仅是静态库。是否可以将 DLL/.so“转换”为静态库?有些。它归结为将其内容转储到目标文件中,恢复所有重定位条目,可能处理版本化符号和弱符号。不,那里没有厨房水槽实用程序,可以在可执行二进制级别为您完成所有这些

如果您可以将自己限制在 Linux,您可能想查看 Flatpak。它所做的是将所有内容打包成一种“自解压存档”,在启动时会透明且无形地将自身解压到一个原位临时安装点(您不会从系统的其余部分看到)。

现在,一种选择是自己构建程序的所有依赖项,并安排将这些构建创建为静态库。在那种情况下,您不再处理 DLL。但是,有些库不想为静态链接构建,因此您的里程可能会有所不同。


真相大白:为什么分发多个文件根本没有问题?在 Linux/*BSD 上,您无论如何都必须提供单独的图标和 .desktop 文件,以便这些内容显示在桌面应用程序菜单中。是的,如果不是处理 XDG 桌面条目文件,我们可以选择将所有这些信息放入一个特殊的 - 我们称之为 .xdgdata - 只读部分,带有一些众所周知的符号名称,那将会很好,所以我们可以拥有真正的单文件可分发可执行文件。


我诚实的建议:不要为此担心。只需发送所有文件即可,不要太担心“看起来如何”。