编译后的可执行文件

编译后的可执行文件

例如,如果我在运行 Ubuntu 的机器上编译了一个使用 GTK 3 的简单 C 程序,我是否能够在其他 Linux 版本上运行它?

注意:我的实际问题是“我应该为 Linux 或 Ubuntu 标记我编译的程序吗?”

例如。我应该将我的下载页面标记为

Windows
    program.exe

Linux
    program

Macintosh
    program.app

或者

Windows
    program.exe

Ubuntu < Version 17.04
    program

Macintosh
    program.app

答案1

Linux 可执行文件并非特定于 Linux 发行版。但它们特定于处理器架构和一组库版本。

可执行文件任何操作系统特定于处理器架构。 Windows 和 Mac 用户不太关心,因为这些操作系统或多或少只在单一架构上运行。 (OSX 过去在多个处理器架构上运行,OSX 应用程序通常作为捆绑包分发,其中包含所有受支持的处理器架构的代码,但现代 OSX 仅在 amd64 处理器上运行。Windows 在 32 位和 64 位 Intel 处理器上运行,因此您可能会找到“32 位”和“64 位”Windows 可执行文件。)

Windows 通过强制程序员将他们使用的所有库与其程序捆绑在一起来解决库依赖性问题。在 Linux 上,这样做并不常见,好处是程序员不需要捆绑库,并且用户可以及时获得库的安全更新和错误修复,但代价是程序需要针对不同版本的发行版进行不同的编译。

因此,您应该将二进制文件标记为“Linux,64 位 PC (amd64),为 Ubuntu 17.04 编译”(如果这是 32 位可执行文件,则为“32 位 PC (i386)”),并提供详细信息所需的库。您可以使用以下命令查看可执行文件使用的库ldd: run ldd program。前面的部分=>是重要的,例如libgtk-3.so.0主要的 GTK3 库,版本为 0(如果曾经有版本 1,它将与版本 0 不兼容,这就是更改版本号的原因)。其中一些库是每个人都会拥有的东西,因为它们已经很多年没有改变了;只有通过查看多个发行版和多个版本的经验或比较才能告诉您这一点。如果其他发行版的用户具有兼容版本的库,则可以运行相同的二进制文件。

相关内容