2013-04-24 60 views
14

我有几个静态库,我不是所有者,用旧版本的g ++(4.3.2,C++ 11/C++ 0x not activated)编译。当我用g ++ 4.6(no C++ 11)编译我的代码并将它与这些 静态库链接(使用g ++ 4.6)时,它链接正常,我似乎没有在运行时遇到任何问题(未经测试一切尽管)。 所以我很想去考虑向前兼容性。g ++总是向后兼容“旧”静态库?

现在我想用C++ 11编译我的代码,并将它与那些相同的链接,而不是重新编译静态库。威尔仍然工作?

换句话说, ABI在g ++中的变化只是一个连接向前兼容性的问题,或者也可以得到向后兼容性问题吗?

谢谢。

回答

22

的G ++ ABI的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及更高版本中已经修复) so you ca n连接C++ 98和C++ 11一起代码(除非C++ 11代码用GCC 4.7.0或4.7.1内置)

然而一些C++ 11库类型是目前还不稳定,在版本之间变化,例如因为它们是在最终的C++ 11标准之前首次发布的,必须进行更改以符合最终规则。因此,将使用GCC 4.6和C++ 11代码构建的C++ 11代码与使用GCC 4.8构建的代码混合并不一定安全。对于您的情况,所有C++ 11代码都使用GCC 4.8构建,好。如果你升级编译器,你应该用新的GCC重建所有的C++ 11代码以保证安全。 (你不需要重建C++ 98/C++ 03代码)

+0

完美谢谢! (我会upvote你,但我不允许,但似乎) – 2013-04-24 17:38:57

+0

N.B.我刚刚添加的最后两段,我最初应该已经说清楚了,但是很忙,很抱歉 – 2013-04-24 22:16:59

+0

谢谢你的精度,Jonathan(哦,对,**来自ACCU 2013的** Johathan!解释质量的答案:) – 2013-04-25 09:19:40

0

与编译器供应商一样,C++ 11标准的目标是维护向后兼容性。只要图书馆没有使用任何“中断”C++ 11标准,图书馆格式本身应该是相同的。

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

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