在 Linux 中分发带有依赖项的二进制文件

在 Linux 中分发带有依赖项的二进制文件

我正在开发一个跨平台应用程序,但在分发 Linux 二进制文件时遇到了麻烦。在 Windows 中,dll 是 -libsndfile-1.dll lua5.1.dll lua51.dll openal32.dll sfml-audio.dll sfml-graphics.dll sfml-network.dll sfml-system.dll sfml-window.dll

这是一个非常早期的预发布版本,所以我不想编写软件包。我只想让用户下载一个 tarball 并运行里面的二进制文件。用户在 Linux 中获取这些依赖项的典型方法是什么,而无需编写软件包?

PS 另外,我使用的是 64 位 Linux,但有一位用户报告说该应用程序无法在其 32 位 Linux 上运行。这可能是什么问题?我在 Windows 上没有遇到这个问题(Windows 是基于 64 位系统构建的,可在 32 位上运行)。

答案1

我不确定这是否正是您想要的,但对于 Linux 程序,通常会在提供产品下载的网页上列出依赖项。对于您来说,类似

您需要安装以下软件:

(如果您的程序仅适用于某些版本,显然也要指定版本号)然后 Linux 用户会在尝试安装您的程序之前检查他们的包管理器以确保他们拥有所有这些版本。

有些程序的发布方式与 Ignacio 解释的一样,即在发布的档案中包含您需要的所有依赖项。这往往会让一些人感到有些烦恼,因为他们被困在无法升级的库的额外副本中,甚至可能与系统版本发生冲突。

答案2

Linux 中的等效操作是将 .so 文件包含在包内的目录中,并设置一个 shell 脚本$LD_LIBRARY_PATH来指向该目录,然后运行二进制可执行文件。

32 位与 64 位的问题在于,编译器会生成 64 位代码,并链接到 64 位库。您需要安装 32 位工具链才能构建 32 位二进制文​​件。您可以file针对各种二进制文件运行以确认这一点。

答案3

您可以将程序静态链接到除 libc 和 libm 之外的所有库。(哎呀,您甚至可以链接它们)。

答案4

您可以使用以下方式获取二进制文件的依赖项ldd 命令

例如:

ldd program_binary

        libctest.so.1 => /opt/lib/libctest.so.1 (0x00002aaaaaaac000)
        libc.so.6 => /lib64/tls/libc.so.6 (0x0000003aa4e00000)
        /lib64/ld-linux-x86-64.so.2 (0x0000003aa4c00000)

但最好作为源共享,因为库可能是具有不同符号或不同架构的不同版本。

相关内容