14

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

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

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

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

4

2 回答 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::pair和使用时存在 ABI 不兼容问题std::list,已在 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 代码)

于 2013-04-24T15:47:12.460 回答
0

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

有关C++11 中引入的更改,请参阅此内容。

因此,假设您用于调用库的代码(包括标题),您应该没问题。

于 2013-04-24T11:10:54.043 回答