发布Linux软件-兼容性

发布Linux软件-兼容性

我想发布一个适用于 Linux 的 C++ 库。 (当没有其他库动态链接时)是否只有 glibc 版本决定与其他 Linux 发行版的兼容性?

有没有比设置多个虚拟机并在其中进行编译更好的方法来支持过去 5 年的大多数 Linux 发行版?例如,在非常旧的 Linux 系统上编译的 Linux 二进制文件是否可以在新的 Linux 版本上运行?

答案1

Linux 的内核 API 非常稳定。 (我说的是系统调用,而不是内核内的 API。)自 1997 年左右生成的静态链接可执行文件(切换到极低频作为可执行格式)应该适用于任何当前的 Linux 系统。然而,静态链接的可执行文件有许多缺点:它们体积庞大,当在第三方代码中发现错误时无法轻松升级,并且它们往往存在于自己的泡沫中,因为它们在与某些系统功能交互时遇到困难标准库为此提供了可配置的支持(例如 DNS、区域设置、用户帐户……)。

对于库,一个常见的约定是版本中第一个数字的更改表示不兼容的 ABI 更改,版本的其余部分在向后兼容的更改上增加。例如,如果您的程序链接到版本 2.3,它将适用于该库的版本 2.3 或 2.4,但不适用于 2.2 或 3。某些库使用不同的约定。动态链接器使用索纳姆记录在库中,以判断其版本是否合适。

非嵌入式Linux上的标准库是glibc。大约从 1998 年开始,Linux 上的 Glibc 主要版本是 6(因此称为 libc6);上游主要版本是2,这解释了为什么libc6的版本是2。次要的而不是 6。次要的。原则上,与旧版本 libc6 链接的程序应该可以与更新的版本一起使用,尽管早期情况并非总是如此。任何与 Glibc 2.3 或更高版本链接的程序都应该在当前版本上运行。

标准 C++ 库过去的变化速度更快,但当前的主要版本 (6) 自 2005 年左右就已发布。

如果您在较旧的系统上编译程序,它应该可以在较新的系统上运行,前提是所需的库版本可用。采取最旧的 CentOS 支持版本(目前 5 个)和最古老的[old]稳定 Debian 版本(目前气喘吁吁,尽管挤压可能仍然符合条件);如果您生成可在两者上运行的二进制文件,则它可能适用于所有 Linux 安装(不包括嵌入式系统和运行安全更新不再可用的过时版本的系统)。

答案2

是的,大多数情况下,尽管您可能需要避免新的内核功能。

如果您希望创建可移植的 C++ 程序,建议遵守官方 ISO C++ 标准。随着标准的改变,您可能需要调整您的程序,但这通常不是很多工作。

您可以要求 g++ 遵循较旧的标准,以避免您的程序无法在具有较旧库的机器上编译。编译器的定义看起来像

-D__STRICT_ANSI__ -D_ISOC99_SOURCE=1 -D_ISOC9X_SOURCE=1

(对于C)。

当然,还有硬件问题(目标CPU包括IA64等架构,以及SSE等CPU功能)。

相关内容