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

问题描述 投票:14回答:2

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

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

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

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

c++ g++ backwards-compatibility abi
2个回答
22
投票

用于C ++ 98代码的G ++ ABI是向后兼容的,一直回到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 ++使用GCC 4.7.0或4.7.1构建了11个代码

但是,某些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代码)


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.