请解释一下 C++ ABI

Ale*_*x O 13 c++ abi

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

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

(来自这个SO答案

那么C++有稳定的ABI吗?

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

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

Rus*_*lan 14

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

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

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

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