为多个版本的 RedHat 构建应用程序

Building application for multiple version of RedHat

假设在我的公司,我们有相同的用 C++ 编写的应用程序,运行在 RHEL5、6 和 7 的机器上运行。

我想从一个单一的构建服务器(运行ning RHEL7)进行构建,以获得 运行 在旧的 RHEL 版本中的可执行文件。我可以知道它是否可以实现吗?

我希望如果我在 RHEL7 中构建,并在 RHEL5 中使用相应版本的 gcc 和 glibc(以及其他库),生成的可执行文件应该在 RHEL5 中 运行。我的理解正确吗?或者还有更多需要注意的地方?

I expect if I am building in RHEL7, with corresponding version of gcc and glibc (and other libs) available in RHEL5, the resulting executable should run in RHEL5.

理论上是的。实际上,在你的 RHEL7 系统上安装多个版本的 glibc 和其他库可能是一个失败的原因 - 特别是 RHEL5 所需的非常古老的库,尤其是 glibc,它期望对系统有很多了解。

反过来可能更容易 - 在 RHEL5 上构建所有内容,link 尽你所能 但 glibc (link 静态地反对 glibc 基本上是不可能的) 并希望前向二进制兼容性足够好。这是通常采用的路线 ("build on the oldest Linux distribution you want to support"),但我怀疑 glibc 的前向二进制兼容性是否可行,因为与 RHEL7 相比,RHEL5 非常 古老。

回到最初的计划,在 RHEL7 机器内的容器中安装 RHEL5 和 6 并构建这些版本可能更容易。毕竟,这有点像在 RHEL7 机器上安装它们的 gcc 和库版本,但在 非常 中分离得很好的 sysroots - 但没有拥有不同构建机器的开销(它们都是同一个内核)。

最后,极端的方法是使用替代的 libc(仅依赖于内核,选择您想要支持的最旧的)并静态编译所有内容。这可以做到,例如使用 musl,但你必须编译你的编译器、你的 libc 和所有你的依赖项。不过,好的结果是您将能够构建完全独立的可执行文件,能够 运行 在您确定的最低要求之后的几乎任何内核上。

Red Hat Developer Toolset (DTS) 是一种 GCC 产品,您可以在其中编译一个主要的 OS 版本,并在该版本和下一个主要版本上进行部署。这将涵盖您在 RHEL 6 和 7 上的工作。对于 RHEL 5,您将继续单独执行此操作。

DTS 安装新版本的 GCC "along side" original/base 版本,因此它不会破坏您的 OS。

我也喜欢 Matteo 的容器创意。

https://developers.redhat.com/products/developertoolset/overview/