构建多版本RedHat的应用程序 假设在我的公司中,我们有同样的C++应用程序,运行在RHEL5、6和7的机器上。

构建多版本RedHat的应用程序 假设在我的公司中,我们有同样的C++应用程序,运行在RHEL5、6和7的机器上。,c++,build,rhel,C++,Build,Rhel,我想从一个构建服务器(运行RHEL7)构建,以获取在RHEL的旧版本中运行的可执行文件。我可以知道这是否可以实现吗 如果我在RHEL7中构建,并且RHEL5中提供了相应版本的gcc和glibc(以及其他LIB),那么生成的可执行文件应该在RHEL5中运行。我的理解正确吗?还是有更多的事情需要注意 如果我在RHEL7中构建,并且RHEL5中提供了相应版本的gcc和glibc(以及其他LIB),那么生成的可执行文件应该在RHEL5中运行 理论上,是的。实际上,在RHEL7系统上安装多个版本的glib

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

如果我在RHEL7中构建,并且RHEL5中提供了相应版本的gcc和glibc(以及其他LIB),那么生成的可执行文件应该在RHEL5中运行。我的理解正确吗?还是有更多的事情需要注意

如果我在RHEL7中构建,并且RHEL5中提供了相应版本的gcc和glibc(以及其他LIB),那么生成的可执行文件应该在RHEL5中运行

理论上,是的。实际上,在RHEL7系统上安装多个版本的glibc和其他库可能是一个失败的原因,尤其是RHEL5所要求的非常旧的版本,尤其是glibc,它希望对系统了解很多

反之可能更容易——在RHEL5上构建所有内容,静态链接除了glibc(基本上不可能针对glibc进行静态链接),并希望前向二进制兼容性足够好。这是通常采用的方法(“在您想要支持的最古老的Linux发行版上构建”),但我怀疑glibc的前向二进制兼容性是否有效,因为RHEL5与RHEL7相比非常古老

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

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

如果我在RHEL7中构建,并且RHEL5中提供了相应版本的gcc和glibc(以及其他LIB),那么生成的可执行文件应该在RHEL5中运行

理论上,是的。实际上,在RHEL7系统上安装多个版本的glibc和其他库可能是一个失败的原因,尤其是RHEL5所要求的非常旧的版本,尤其是glibc,它希望对系统了解很多

反之可能更容易——在RHEL5上构建所有内容,静态链接除了glibc(基本上不可能针对glibc进行静态链接),并希望前向二进制兼容性足够好。这是通常采用的方法(“在您想要支持的最古老的Linux发行版上构建”),但我怀疑glibc的前向二进制兼容性是否有效,因为RHEL5与RHEL7相比非常古老

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

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

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

DTS在原始/基本版本的基础上安装新版本的GCC,因此不会破坏您的操作系统

我也喜欢Matteo的容器创意

请参见

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

DTS在原始/基本版本的基础上安装新版本的GCC,因此不会破坏您的操作系统

我也喜欢Matteo的容器创意


请参见

一般规则是:在您想要支持的最旧版本的Linux发行版上编译。其他任何事情都是痛苦的世界。此外,就个人而言,除了glibc之外,我会静态链接所有内容(由于各种令人遗憾的原因,这是不可能的)。一般规则是:在您想要支持的最旧版本的Linux发行版上编译。其他任何事情都是痛苦的世界。此外,就个人而言,我会静态链接除glibc之外的所有内容(由于各种令人悲伤的原因,这根本不可能)。“在RHEL7机器内的容器中安装RHEL5和6并构建这些版本可能更容易”你是指类似Docker容器的东西吗?或者我需要一个全尺寸的虚拟机来安装RHEL5/6?Docker、LXC容器,无论在那里使用什么。这应该足够了,使用过的土地正在与更新的内核进行通信这一事实应该不是一个问题,因此VM应该是不必要的。“在RHEL7机器内的容器中安装RHEL5和6并构建这些版本可能更容易”你指的是类似Docker容器的东西吗?或者我需要什么