我想为Linux发布一个C++库。是否只有glibc版本决定与其他Linux发行版的兼容性(当没有其他库被动态链接时)?
在过去5年中,是否有更好的方法来支持大多数Linux发行版,而不是设置几台虚拟机并在那里编译呢?例如,在一个非常老的Linux系统上编译的Linux二进制文件会在新的Linux版本上运行吗?
发布于 2015-05-26 01:14:19
Linux的内核API非常稳定。(我指的是系统调用,而不是内核中的API。)自1997年或前后产生的静态链接可执行文件(切换到小精灵作为可执行格式)应该可以在任何当前的Linux系统上工作。然而,静态链接的可执行文件有许多缺点:它们笨重,当在第三方代码中发现bug时,它们不容易升级,而且它们往往生活在自己的泡沫中,因为它们无法与标准库提供可配置支持的一些系统特性交互(例如DNS、locale、用户帐户、…)。。
对于库,一个常见的约定是,版本中第一个数字中的a更改表示不兼容的ABI更改,其余版本在向后兼容的更改中增加。因此,例如,如果您的程序与版本2.3相链接,它将使用库的2.3或2.4版本,而不是2.2或3版本。动态链接器使用库中记录的索纳姆来决定其版本是否合适。
非嵌入式Linux上的标准库是格利布。从1998年开始,Glibc的主要版本在Linux上是6(因此它被称为libc6);上游的主要版本是2,这就解释了为什么libc6的版本是2 2.MINOR,而不是6.MINOR。原则上,与较旧版本libc6相关联的程序应该与更新的版本一起工作,尽管在早期并不总是如此。任何与Glibc 2.3或更高版本相关的程序都应该在当前版本上工作。
标准的C++库过去变化更快,但是当前的主要版本(6)自2005年以来一直是最新的。
如果您在旧系统上编译程序,那么它应该可以在较新的系统上运行,前提是所需的库版本是可用的。以支持最老版本的中心 (当前为5)和最老[旧]稳定的Debian版本为例(虽然挤压可能仍然够格);如果您生成一个运行在两者上的二进制文件,那么它很可能在所有Linux安装上都能工作(不包括嵌入式系统和那些运行过时版本的系统,而这些系统的安全性更新不再可用)。
发布于 2015-05-25 09:34:58
是的,虽然您可能需要避免新的内核特性,但大多数情况下是这样。
如果您希望创建一个可移植的C++程序,则建议您遵守正式的ISO C++标准。随着标准的改变,您可能需要调整您的程序,但这通常不是很多工作。
您可以要求g++保持较旧的标准,以避免在具有旧库的机器上编译程序。为编译器定义如下
-D__STRICT_ANSI__ -D_ISOC99_SOURCE=1 -D_ISOC9X_SOURCE=1(为C)。
当然,也存在硬件问题(目标CPU包括IA64之类的体系结构,以及诸如SSE这样的CPU特性)。
https://unix.stackexchange.com/questions/205470
复制相似问题