5

不解决 C++ 某些问题的常见解释是它会破坏 ABI 并需要重新编译,但另一方面我遇到如下语句:

老实说,几乎所有 C++ 非 POD 类型都是如此,而不仅仅是例外。可以跨库边界使用 C++ 对象,但通常只要使用相同的工具和标准库编译和链接所有代码即可。例如,这就是为什么所有主要版本的 MSVC 都有 boost 二进制文件的原因。

(来自这个 SO 答案

那么 C++ 是否有稳定的 ABI?

如果是这样,我是否可以在同一平台上混合和匹配使用不同工具集编译的可执行文件和库(例如 Windows 上的 VC++ 和 GCC)?如果没有,有没有办法做到这一点?

更重要的是,如果 C++ 中没有稳定的 ABI,为什么人们如此关注破坏它呢?

4

2 回答 2

4

尽管 C++ 标准没有规定任何 ABI,但一些实际实现努力保持工具链版本之间的 ABI 兼容性。例如,在 GCC 4.x 中,可以使用与旧libstdc++版本libstdc++. 较旧版本的库所期望的符号由较新的 提供libstdc++.so,并且 C++ 标准库中定义的类的布局是相同的。

std::string但是当 C++11 对and引入新的要求时,如果不改变这些类的布局std::list就无法实现这些要求。libstdc++这意味着,如果您不使用GCC 5 及更高版本的_GLIBCXX_USE_CXX11_ABI=0kludge,则无法std::string在 GCC4 编译的库和 GCC5 编译的程序之间传递例如对象。所以ABI坏了。

一些 C++ 实现并没有那么努力地拥有兼容的 ABI:例如 MSVC++ 不提供主要编译器版本之间的这种兼容性(请参阅这个问题),因此必须提供不同版本的库以与不同版本的 MSVC++ 一起使用。

所以,一般来说,你不能混合和匹配使用不同版本编译的库和可执行文件,即使是同一个工具链。

于 2021-06-04T22:40:37.883 回答
0

C++ 目前还没有 ABI 标准。他们试图将其纳入标准;您可以阅读以下内容,详细说明:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p2028r0.pdf

于 2021-06-04T14:35:03.983 回答