g ++总是与“旧”静态库向后兼容?

时间:2013-04-24 11:01:05

标签: c++ g++ backwards-compatibility abi

我有一些静态库,我不是它的所有者,使用旧版本的g ++ 4.3.2编译(c ++ 11 / c ++ 0x未激活)。

当我使用g ++ 4.6(无c ++ 11)编译我的代码时,使用g ++ 4.6将它们链接起来 静态库,它链接很好,我似乎没有在运行时遇到任何问题(虽然没有测试一切)。 我很想认为前向兼容性还可以。

现在我想用gcc 4.8和c ++ 11编译我的代码,并且仍然将它与那些相同的,而不是重新编译的静态库链接。

g ++中的ABI更改只是链接向前兼容性的问题,还是会出现向后兼容性问题?

2 个答案:

答案 0 :(得分:22)

G ++ ABI for C ++ 98代码向后兼容,一直回到GCC 3.4

因此,如果您使用GCC 4.8编译和链接最终可执行文件,则可以链接到使用GCC 3.4到4.8(但没有更新版本)构建的对象和库

C ++ 11 ABI与C ++ 98 ABI相同,C ++ 98和C ++ 11共有的标准库类型具有相同的定义,(忽略GCC 4.7) .0和GCC 4.7.1,在使用C ++ 11时在std::pairstd::list中具有ABI不兼容性,已在4.7.2及更高版本中修复了以便您可以将C ++ 98和C ++ 11代码链接在一起(除非C ++ 11代码是使用GCC 4.7.0或4.7.1构建的)

然而某些C ++ 11库类型尚不稳定,并且在版本之间发生变化,例如:因为它们是在最终的C ++ 11标准之前首次发布的,并且必须更改以匹配最终规则。因此,混合使用GCC 4.6构建的C ++ 11代码和使用GCC 4.8构建的C ++ 11代码不一定安全

对于您的情况,所有C ++ 11代码都是使用GCC 4.8构建的,这样就可以了。如果升级编译器,则应使用较新的GCC重建所有C ++ 11代码以确保安全。 (您不需要重建C ++ 98 / C ++ 03代码)

答案 1 :(得分:0)

C ++ 11标准的目标是保持向后兼容性,编译器供应商也是如此。只要库不使用“打破”C ++ 11标准的任何东西,库格式本身应该是相同的。

有关C ++ 11中引入的更改,请参阅this

因此,假设你用来调用库的代码(包括头文件),你应该没问题。