c++ - 如何保证共享库在 Linux 发行版之间可移植?
问题描述
例如:
QT 曾经为其框架提供离线安装程序 https://www.qt.io/offline-installers
我假设安装程序正在将预构建的运行时库处理到 Linux 机器。(除其他外)但他们“知道”的唯一一件事是它是 X64 机器。
如果 QT 库是在带有 gcc X_Y_Z 的 Linux“X”发行版上预编译的,他们如何确定它们可以在具有不同 gcc 版本的任何其他发行版上工作?
问题与 QT 无关,仅作为示例来了解此类安装程序如何工作。
编辑 在 qt 站点中找到了这个,它们确实需要很少的操作系统和编译器版本才能使离线安装程序工作
所以也许安装程序有很少的内置包组合发行版和 g++ 版本,它选择在运行时安装哪个?
解决方案
如果您检查 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。
“ 库 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
.
推荐阅读
- jdbc - HSQL 中的 setArray() 异常
- javascript - 如何使用 JavaScript 创建用户名正则表达式?
- python - 更改 sklearn 管道的参数
- javascript - 需要回答“参数 (number[]) 与 SpreadsheetApp.Range.setValues 的方法签名不匹配”错误
- r - R Regex:修改字符串末尾不同长度的数字
- firebase - 无法从数据库获取 DataSnapshot 并获取空值
- python - 对于特定的 pep8 问题,什么是解析 python 代码的更好方法
- angular - TypeError: 你提供了'function selectOperator(source$) 需要流的地方
- powershell - 根据共性(直接和间接)将哈希表分组在一起
- compiler-errors - NDK 静态库项目无法为 arm64-v8a 编译