【问题标题】:C++ Library CompatibilityC++ 库兼容性
【发布时间】:2011-06-09 23:57:10
【问题描述】:

我目前正在编写一个库,并且正在考虑从 GCC 4.1.2 迁移到 GCC 的 4.5.2(最新版本)。如果我将我的代码编译到静态库中,我可以假设编译器兼容性(显然在同一个操作系统上)对客户端来说应该不是问题吗?

编辑 进一步澄清:如果我向客户提供一个使用 gcc 4.5.2 编译的静态链接库,那么在他们必须使用的编译器和版本方面,这对该库的用户有什么限制?

【问题讨论】:

  • 如果我理解你的问题是正确的..那么是的。
  • 我已经澄清了我的问题,请参阅编辑。

标签: c++ gcc compiler-construction binary-compatibility


【解决方案1】:

刚刚遇到这个问题,我相信它回答了我来自http://gcc.gnu.org/bugs/#nonbugs 的问题:

ABI 更改 C++ 应用程序二进制文件 接口(ABI)由两个 组件:第一个定义如何 类的元素布局,如何 函数被调用,函数如何 名称被破坏等;第二 部分处理的内部 libstdc++ 中的对象。虽然我们 到目前为止,争取一个不变的 ABI 我们不得不修改它 主要版本。如果你改变你的 编译到不同的主要版本 您必须重新编译所有库 包含 C++ 代码。如果你不这样做 您可能会遇到链接器错误或 故障程序。我们的一些 Java 支持库还包含 C++ 代码,所以你可能想要 重新编译所有库以确保安全。它 不需要重新编译 如果您已更改为错误修复 发布相同版本的 编译器;错误修复版本很小心 以避免 ABI 更改。另见 GCC 的兼容性部分 手册。

备注:指定主要版本 通过更改第一个或第二个 两部分或三部分的组成部分 版本号。次要(错误修复) 发布是由更改指定 仅第三个组件。因此 GCC 3.2 和 3.3 是主要版本,而 3.3.1 和 3.3.2 是 GCC 3.3 的错误修复版本。有了 3.4 系列,我们 正在引入新的命名方案; 这个系列的第一个版本是 3.4.0 而不仅仅是 3.4。

据我了解,我需要确保客户将我的库与 gcc 的主要版本兼容版本链接。

【讨论】:

    【解决方案2】:

    提供静态库还是动态库并不重要,用户仍然需要使用兼容的编译器/链接器来链接它。通常当 GCC 进行 ABI 更改时,他们会提供一个可以设置为使用旧 ABI 的开关。我知道他们在从 3.x 升级到 4.x 甚至 4.x 系列中的几个版本时都这样做了。

    【讨论】:

      猜你喜欢
      • 2021-08-27
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 2014-10-11
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      • 2010-09-15
      相关资源
      最近更新 更多