30

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

4

3 回答 3

20

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

于 2010-05-10T13:14:39.453 回答
16

官方 ABI 页面指向ABIcheck。这个工具可以做你想要的。

于 2010-05-10T12:23:06.237 回答
5

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

二进制不兼容通知!

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

  • 默认情况下启用选项 -mms-bitfields,这意味着位域布局遵循 Microsoft 编译器的约定。

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

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

于 2014-05-07T14:48:01.750 回答