【问题标题】:How to pack files into one executable file for Linux and Windows?如何将文件打包成一个适用于 Linux 和 Windows 的可执行文件?
【发布时间】:2021-12-29 06:17:46
【问题描述】:

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

【问题讨论】:

    标签: linux windows go cross-platform


    【解决方案1】:

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

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

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

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


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


    我诚实的建议:不要为此烦恼。只需发送整批文件,不要太担心“这看起来如何”。

    【讨论】:

    • 如果 Linux 没有问题将所有文件打包成 snap 或 flatpak 包,那么至少如何为 Windows 制作一个文件?这个问题是我最担心的。
    • 或者也许使用 Qt 代替 Ultralight?
    • Qt 更适合我的情况。 github.com/therecipe/qt 这允许创建跨平台桌面应用程序并允许部署为单个文件
    猜你喜欢
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多