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

我碰巧在Linux上安装了ModelSim VHDL模拟器。手册上说它只支持RedHat或Suse,但我刚好尝试在Ubuntu上安装它。而且,我能够顺利地安装它,没有任何问题。

enter image description here

  • Linux的二进制文件是否适用于所有类型的发行版?我的意思是,如果我在发行版A上开发一个程序,我能确定它能在任何Linux上运行吗?
  • 为什么大多数商业软件供应商都说他们的程序只能在特定的发行版上运行?(主要是Redhat和Suse,而不是Ubuntu)
3个回答

这是两个问题:
Linux 二进制文件是否适用于所有发行版?
答案取决于:
- 如果程序仅使用 Linux 内核,除了 32 位或 64 位的问题以外,它将是通用的。一个 Linux 的 "Hello World" 程序(一个仅在终端窗口打印 "Hello World" 的简单程序)可能与发行版无关。 - 如果程序使用任何非内核库或服务(这是大多数 Linux 的情况,内核相对较小),则包含的库、库版本和位置会有差异。因此,在这种(最常见的)情况下,各个发行版并不相同。
为什么许多商业程序声称仅适用于一个或少数几个发行版?
因为有 非常多的 Linux 发行版,没有人愿意在所有发行版上测试他们的程序。
商业供应商通常会声明他们仅支持已经在其软件上进行过测试的发行版。它可能在其他发行版上工作也可能不工作,从供应商的角度来看,关键是如果程序在他们不支持的发行版上不工作,你就不能抱怨。

测试所选择的发行版取决于供应商对其客户使用情况的预期。商业/专业程序通常选择企业级发行版,可能是出于类似于“支付操作系统费用的人更有可能支付我们的软件费用”的推理,可能仅仅是通过统计现有客户使用的发行版来确定。

另请参阅由 Mark Shuttleworth(Ubuntu 存在的原因)提供的关于 Ubuntu 和 Debian 之间二进制兼容性的信息 - Debian 是 Ubuntu 的最接近的相关发行版


红帽和SUSE都有着悠久的企业Linux传统,并成功地为它们生产和测试了这些软件包。随着时间的推移,将会有更多经过测试可在Ubuntu上运行的软件包的例子出现。事实上,自去年以来,许多这样的软件包都已经经过测试,可以与Ubuntu一起使用。随着Canonical与更多供应商达成协议,将会有更多经过Ubuntu认证的软件包。
对于您的第一个问题:如果您想创建一个在所有发行版上运行的程序,请创建一个静态(相对于动态)可执行文件。一个静态链接的可执行文件不依赖于系统库,因此只要架构(如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文件并使用alien将其转换为.deb文件。然后进行安装。如果成功了,就没问题了。如果不成功,使用ldd命令找出缺失的库文件是哪个。在最糟糕的情况下,为其他Linux发行版创建一个虚拟机,在那里运行该程序。

我赞同j-g-faustus的回答,但是你还需要注意软件包的格式。即使可执行文件本身是可移植的,并且所有必要的库都存在,不同的发行版会将文件放在不同的位置,并使用不同的工具来管理已安装的软件包。如果供应商将其产品打包为RPM软件包,则您需要使用类似于'alien'的软件包来将其转换并安装到基于DEB的发行版(如Ubuntu)下。
如果他们以源代码的形式分发软件,那么您也可以尝试自己编译它,这样可执行文件将适用于您特定的系统(但是Ubuntu软件包管理器将不知道它)。