繁体   English   中英

请解释C++ ABI

[英]Please explain the C++ ABI

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

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

(来自这个 SO 答案

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM