首页 > 解决方案 > 如何保证共享库在 Linux 发行版之间可移植?

问题描述

例如:

QT 曾经为其框架提供离线安装程序 https://www.qt.io/offline-installers

我假设安装程序正在将预构建的运行时库处理到 Linux 机器。(除其他外)但他们“知道”的唯一一件事是它是 X64 机器。

如果 QT 库是在带有 gcc X_Y_Z 的 Linux“X”发行版上预编译的,他们如何确定它们可以在具有不同 gcc 版本的任何其他发行版上工作?

问题与 QT 无关,仅作为示例来了解此类安装程序如何工作。

编辑 在 qt 站点中找到了这个,它们确实需要很少的操作系统和编译器版本才能使离线安装程序工作

所以也许安装程序有很少的内置包组合发行版和 g++ 版本,它选择在运行时安装哪个?

https://doc.qt.io/qt-5/linux.html

标签: c++linuxqtinstallationshared-libraries

解决方案


如果您检查 lib 目录,您将看到有多个符号链接。

因此,对于某个库,它可能如下所示:

libname.so     -> libname.so.1
libname.so.1   -> libname.so.1.8
libname.so.1.8 -> libname.so.1.8.4
libname.so.1.8.4

库供应商通常会为其版本跳转提供一定的 API 兼容性。因此,作为开发人员,您可以链接例如,libname.so.1您是否知道库供应商只会在1.x.y.

或者,libname.so.1.8如果您想更具体地了解已安装的版本,您可以链接。

发行版(或供应商)提供的软件包通常会提供那些 API 中存在重大更改的版本。

因此,作为库/应用程序开发人员,您将检查您的依赖项使用的版本方案,并以限制最少的方式进行链接,以保证您的稳定性和兼容性。

对于 c++ 运行时库也是如此:

libstdc++.so        -> libstdc++.so.6.0.28
libstdc++.so.6      -> libstdc++.so.6.0.28
libstdc++.so.6.0.28

编译器版本并不真正相关,相关的是运行时库,它需要与安装的二进制文件兼容 ABI。

GCC:ABI 政策和指南

“ 库 API + 编译器 ABI = 库 ABI ”<br /> 库 ABI 主要适用于具有未解析符号并动态链接到 C++ 标准库的最终用户,因此必须小心使用与可用的 C++ 标准库二进制文件兼容的编译器。在这种情况下,用上面的等式定义兼容:给定使用给定编译器 ABI 和库 API 编译的应用程序,它将与使用相同约束创建的标准 C++ 库正常工作。
[…]
具有等效 DT_SONAME 的二进制文件是向前兼容的:在下表中,明确指出了与前一个不兼容的版本。如果未列出特定版本,则其 libstdc++.so 二进制文件具有与先前版本相同的文件名和 DT_SONAME。

因此,如果没有另外提及,所有libstdc++.so.x版本都是向前兼容的。因此,如果您构建您的应用程序libstdc++.so.6.0.1,它将与 兼容libstdc++.so.6.0.28,因此您可以链接到libstdc++.so.6.


推荐阅读