如何编译可在旧版Linux发行版上运行的二进制文件?

3
我有Ubuntu 16.10。如何编译一个C++程序,以便二进制文件可以在Ubuntu 14.04或任何类似年龄的Linux发行版上正常工作?(我只关心x86-64。)
这是否可通过16.10上的默认编译器(gcc 6.2)实现,还是需要安装并使用14.04所拥有的相同编译器(gcc 4.8)?如果需要旧版本编译器,是否需要-multilib包?
我对通用(与发行版无关)的兼容性需求和更具体的提示,如何在我的Ubuntu版本上进行操作都感兴趣。

在我的情况下,我需要虚拟机来测试程序是否在目标发行版上运行,因此我只是在旧的发行版上构建可执行文件,并不断测试,直到它们都能够构建可执行文件并且所有的发行版都能够运行在任何一个上构建的可执行文件。 - user4581301
在理想的情况下,我会这样做。但不幸的是,我只能利用个人资源在业余时间完成这项工作,而这些资源已经被耗尽。我已经有太多的虚拟机了,所以我只能在三个主要的操作系统上进行构建。我请求其他人在旧版Linux上进行测试。我曾经在较旧的Ubuntu(15.x?)上安装gcc 4.8来使其正常运行。不幸的是,我当时丢失了笔记...我也希望有一种方法可以不安装旧的工具链来实现这一目标。 - Szabolcs
最重要的是,您需要使用适当旧的库版本进行编译,即那些出现在较旧发行版中的库。 - Daniel Jour
@DanielJour 有没有办法在新版本的发行版上安装它们?由于可以为完全不同的架构或ABI(例如ARM或x32)进行交叉编译,因此我认为应该也可以针对同一架构的旧版本进行目标定位。 - Szabolcs
@Szabolcs 嗯...你可以尝试在chroot中进行所述旧发行版的最小安装。这将引入旧的库,从chroot内部进行编译应该是可能的。比虚拟机少CPU“开销”,但仍然(取决于您可以获得多少“最小”发行版)有一些空间开销。 - Daniel Jour
@Szabolcs 没有真正的方法来保留两个不同版本的库,这就是像gobolinux这样的东西。如果两台机器的架构相同(或类似,以便您可以禁用某些功能以获得兼容性),那么chroot是另一个有效的解决方案;最后,如果您成功使用了不依赖于其他系统库的静态库,您可以像通常一样进行编译。 - Lesto
1个回答

0

丑陋的解决方案是将所有内容(包括C++运行时)静态链接在一起,生成巨大的单体可执行文件,这样就不会过多依赖系统库(例如Go语言中的做法)。另一个丑陋的解决方案是设置一些CI并在所有支持的系统上构建所有内容。然而,这很可能意味着在考虑最旧的支持系统的情况下编写所有内容,并与兼容性问题作斗争。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接