C++ GCC ABI兼容性

C++ GCC ABI兼容性,c++,gcc,compatibility,abi,C++,Gcc,Compatibility,Abi,据我所知,不可能链接使用不同版本的GCC应用程序二进制接口(ABI)的库。GCC的每个版本都有ABI更改吗?如果我使用GCC4.3.2,是否可以链接使用4.3.1构建的库?是否有某种类型的矩阵列出了我可以组合GCC版本的所有方法?指向一个。这个工具可以做你想做的事。由于gcc-3.4.0,ABI是向前兼容的。也就是说,使用旧版本制作的库可以与新版本链接,并且应该可以工作(反之则不行)。显然,可能会有bug,但文档中只提到了一个:啊,哎呀。 如何判断哪个gcc编译了给定的二进制文件?这是你的电话号

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

指向一个。这个工具可以做你想做的事。

由于gcc-3.4.0,ABI是向前兼容的。也就是说,使用旧版本制作的库可以与新版本链接,并且应该可以工作(反之则不行)。显然,可能会有bug,但文档中只提到了一个:

啊,哎呀。
如何判断哪个gcc编译了给定的二进制文件?这是你的电话号码 gcc-4.7.2-1-mingw32.README.txt中的死亡通知:

二进制不兼容通知! <> P> C和C++ ABI在GCC 4.7.0中发生变化,这意味着一般不能 将使用此版本的编译器编译的二进制文件链接在一起,然后 使用GCC 4.7.0之前的版本。特别是:

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

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

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


Hm,官方ABI页面有一个代码示例(多个ABI测试),其中使用了多个版本。。。如果他们说你应该用相同的版本重新编译所有的东西,这怎么可能呢?这个例子展示了如何使用链接器来链接多个库。但是它们是不可互操作的:例如,你不能将向量从第一个库传递到另一个库。也就是说,这相对来说毫无意义,因为这显然是你想要做的事情。你能澄清一下第二句话吗?如果我的共享dll是较旧的版本,但可执行文件是较新的,则可以;但如果我的共享dll较新,而可执行文件较旧,则不是?@Cookie,对。请注意,对于编译器来说,标准库有自己的规则,但它们也尝试向前兼容。从GCC 5.1开始,它看起来不再向前兼容。另请参阅和。GCC 5.2也有同样的问题:我无法链接两个库:一个来自UbuntuWily软件包,另一个来自Intel Pin软件包(它是用旧版本的GCC编译的)。我想这只适用于在Windows上使用GCC的人。在Linux上,由于4.7.0和4.7.1中的一个错误,除了C++11用户之外,没有任何兼容性破坏。即使这在4.7.2中是固定的,所以只要避免两个不好的版本,你就没事了。GCC 5.1会变得更好。。。另请参见和。