【问题标题】:How a shared library can be guaranteed to be portable between Linux distributions?如何保证共享库在 Linux 发行版之间可移植?
【发布时间】:2020-11-30 06:20:17
【问题描述】:

例如:

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++ linux qt installation shared-libraries


【解决方案1】:

如果您检查 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 Policy and Guidelines

“库 API + 编译器 ABI = 库 ABI”
库 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

【讨论】:

  • 我认为 OP 不是询问下载二进制文件的不同版本,而是询问不同的编译器版本。
  • @m7913d 这与要下载的不同版本无关,而是要链接的库的不同版本,因为问题不仅与stdlibc ++有关,例如QT链接也再次一堆其他共享库,如 libxml。但我添加了有关stdlibc++ 的具体信息来澄清这一点。
  • 我的问题不是关于同一 arch 上不同版本的库。这就是库提供者如何提供 SAME 库的方式,它适用于所有 linux 平台和编译器
  • @user3717741 - 那么简单的答案。你不能。顺便说一句,刚刚添加的信息与您最初的陈述不符。您在上面指定了 x64。
  • @t.neise 如果您点击 qt 链接,您将看到 linux64 的单个下载 .run 文件,它是如何工作的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
  • 2014-02-22
  • 2021-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多