Linux 二进制文件是否通用於所有类型的发行版?

Linux 二进制文件是否通用於所有类型的发行版?

我碰巧在 Linux 上安装了 model sim VHDL 模拟器。手册上说它只支持 RedHat 或 Suse,但我刚刚尝试在 Ubuntu 上安装它。而且,我可以毫无问题地安装它。

在此处输入图片描述

  • Linux 二进制文件是否适用于所有类型的发行版?我的意思是,如果我在发行版 A 上编写程序,我能确定它可以在任何 Linux 上运行吗?
  • 为什么大多数商业程序供应商都说该程序在特定发行版上运行?(主要是 Redhat 和 Suse,而不是 ubuntu)

答案1

这是两个问题:

Linux 二进制文件是否适用于所有发行版?

这取决于:

  • 如果程序不使用 Linux 内核之外的任何内容,那么除了 32 位或 64 位问题外,它将是通用的。Linux“hello world”(一个只在终端窗口打印“hello world”的极简程序)可能与发行版无关。
  • 如果程序使用任何非内核库或服务(大多数 Linux 都使用非内核库或服务,内核相当小),则包含的库、这些库的版本以及它们的位置会有所不同。因此,在这种(最常见的)情况下,分布并不相等。

为什么许多商业程序说它们仅适用于一个或几个发行版?

因为有一个大量 Linux 发行版,没有人愿意在所有这些平台上测试他们的程序。

商业供应商通常会说他们只支持他们测试过软件的发行版。软件在其他发行版上可能有效,也可能无效,从供应商的角度来看,关键在于,如果它在他们不支持的发行版上无法运行,你就不能抱怨。

选择哪些发行版进行测试取决于供应商希望其客户使用什么。商业/专业程序通常会选择企业发行版,可能是出于类似“为其操作系统付费的人更有可能为我们的软件付费”的推理,也可能只是通过计算其现有客户使用的发行版。

另请参阅 Mark Shuttleworth(正是这个人让我们有了 Ubuntu)Ubuntu 和 Debian 之间的二进制兼容性- Debian 是最近分布亲属Ubuntu。

答案2

RedHat 和 SUSE 都拥有悠久的企业 Linux 传统,并设法为其生产和测试这些软件包。随着时间的推移,将会有更多经过测试可在 Ubuntu 上运行的软件包示例。事实上,自去年以来,许多此类软件包都经过了 Ubuntu 测试。随着 Canonical 与更多供应商达成协议,将会有更多经过 Ubuntu 认证的软件包。

对于您的第一个问题:如果您想制作一个可以在所有发行版上运行的程序,请创建一个静态(相对于动态)可执行文件。statically-linked可执行文件不依赖于系统库,因此可以在发行版之间工作,只要架构(例如 Intel/AMD)相同。

这是一个程序,

int main(void)
{ 
  printf("Hello, World!\n");
  return 0;
}

让我们正常编译,

$ gcc helloworld.c -o helloworld
$ ./helloworld
Hello, World!
$ ldd helloworld
    libc.so.6 => /lib/libc.so.6 (0x00007f3cc3481000)
...
$ 
$ gcc helloworld.c -static -o helloworld_static
$ ./helloworld
Hello, World!
$ ldd helloworld_static
    not a dynamic executable
$ 

那么,你能用这个 VHDL 程序做什么呢?获取 .rpm 文件,然后使用以下命令将其转换为 .deb外星人。然后,安装。如果成功,就没问题了。如果失败,请使用ldd找出缺少哪个库文件。在最坏的情况下,为其他 Linux 发行版创建一个虚拟机并在那里运行该程序。

答案3

我赞同 jg-faustus 的回复,但是,您还需要注意软件包格式。即使可执行文件本身是可移植的并且所有必要的库都存在,不同的发行版也会将文件放在不同的地方并使用不同的工具来管理已安装的软件包。如果供应商将其产品打包为 RPM 包,您将必须使用“alien”之类的包来转换并在基于 DEB 的发行版(如 Ubuntu)下安装它。

如果他们将他们的软件作为源代码分发,那么您也可以自己编译它,此时可执行文件将针对您的特定系统进行定制(但 ubuntu 包管理器不会知道这一点)。

相关内容