【问题标题】:GCC ABI compatibilityGCC ABI 兼容性
【发布时间】:2021-11-26 21:06:56
【问题描述】:

据我了解,无法链接使用不同版本的 GCC 应用程序二进制接口 (ABI) 的库。每个版本的 GCC 都有 ABI 更改吗?如果我使用 GCC 4.3.2,是否可以链接使用 4.3.1 构建的库?是否有某种矩阵列出了我可以组合 GCC 版本的所有方式?

【问题讨论】:

标签: c++ gcc compatibility abi


【解决方案1】:

The official ABI page 指向ABIcheck。这个工具可以做你想要的。

【讨论】:

  • 嗯,官方 ABI 页面有一个代码示例(多个 ABI 测试),其中使用了多个版本......如果他们说你应该用相同的版本重新编译所有东西,这怎么可能?
  • 该示例展示了如何使用链接器来链接多个库。但它们不能互操作:例如,您不能将向量从第一个库传递给另一个库。
  • 也就是说,它相对没有意义,因为这显然是你想做的事情。
【解决方案2】:

从 gcc-3.4.0 开始,ABI 向前兼容。 IE。使用较旧版本制作的库可以与较新版本链接,并且它应该可以工作(反之则不行)。显然,可能存在错误,但文档中只提到了 一个http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33678

【讨论】:

  • 能否请您澄清第二句话?如果我的共享 dll 是旧版本但可执行文件较新,那很好,但如果我的共享 dll 较新,而可执行文件较旧,则不是?
  • @Cookie,对。请注意,对于编译器,标准库有自己的规则,但它们也尝试向前兼容。
  • 从 GCC 5.1 开始,它看起来不再向前兼容。另见Linking problems due to symbols with abi::cxx11?The Case of GCC-5.1 and the Two C++ ABIs
  • 我在使用 GCC 5.2 时遇到了同样的问题:我无法链接两个库:一个来自 Ubuntu Wily 包,另一个来自 Intel Pin 包(已使用旧版本编译gcc)。
【解决方案3】:

呃,哎呀。
你怎么知道哪个 gcc 编译了给定的二进制文件?这里是 来自 gcc-4.7.2-1-mingw32.README.txt 的死亡通知:

二进制不兼容通知!

GCC 4.7.0 中的 C 和 C++ ABI 发生了变化,这意味着通常你不能 将使用此版本的编译器编译的二进制文件链接在一起,并且 GCC 4.7.0 之前的版本。特别是:

  • 选项-mms-bitfields默认开启,表示位域布局 遵循 Microsoft 编译器的约定。

  • C++ 类成员函数现在遵循 __thiscall 调用约定。

  • 编译器现在假定调用者弹出堆栈 指向聚合返回值的隐式参数。这影响 按值返回结构的函数,例如复杂的数学类型。

【讨论】:

  • 明确一点,我认为这只适用于在 Windows 上使用 GCC 的人。在 Linux 上,由于 4.7.0 和 4.7.1 中的错误,除了 C++11 用户之外没有兼容性破坏。即使这在 4.7.2 中已修复,所以只要避免两个坏点版本就可以了。
猜你喜欢
  • 2018-01-07
  • 2011-04-09
  • 2012-09-19
  • 1970-01-01
  • 2013-01-20
  • 2016-02-02
  • 2018-03-25
相关资源
最近更新 更多