据我所知,不可能链接使用不同版本的GCC应用程序二进制接口(ABI)的库。是否对每个版本的GCC都进行了ABI更改?如果我使用GCC 4.3.2,是否可以链接使用4.3.1构建的库?是否有某种矩阵列出了我可以组合GCC版本的所有方法?
答案 0 :(得分:17)
从gcc-3.4.0开始,ABI是向前兼容的。 I.E.使用较旧版本创建的库可以与较新版本链接,它应该可以工作(反之则不然)。显然,可能存在错误,但文档中只提到一个:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33678
答案 1 :(得分:11)
The official ABI page指向ABIcheck。这个工具可以做你想要的。
答案 2 :(得分:2)
C和C ++ ABI在GCC 4.7.0中发生了变化,这意味着一般情况下你不能这样做 链接在一起使用此版本的编译器编译的二进制文件 与GCC 4.7.0之前的版本。特别是:
默认情况下启用选项-mms-bitfields,这意味着位域布局 遵循Microsoft编译器的惯例。
C ++类成员函数现在遵循__thiscall调用约定。
编译器现在假定调用者弹出堆栈 指向聚合返回值的隐式参数。这影响了 函数按值返回结构,如复杂的数学类型。