我有一些静态库,我不是它的所有者,使用旧版本的g ++ 4.3.2编译(c ++ 11 / c ++ 0x未激活)。
当我使用g ++ 4.6(无c ++ 11)编译我的代码时,使用g ++ 4.6将它们链接起来 静态库,它链接很好,我似乎没有在运行时遇到任何问题(虽然没有测试一切)。 我很想认为前向兼容性还可以。
现在我想用gcc 4.8和c ++ 11编译我的代码,并且仍然将它与那些相同的,而不是重新编译的静态库链接。
g ++中的ABI更改只是链接向前兼容性的问题,还是会出现向后兼容性问题?
答案 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::pair
和std::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。
因此,假设你用来调用库的代码(包括头文件),你应该没问题。