c++ - 请解释C++ ABI

标签 c++ abi

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

Honestly, this is true for pretty much all C++ non-POD types, not just exceptions. It is possible to use C++ objects across library boundaries but generally only so long as all of the code is compiled and linked using the same tools and standard libraries. This is why, for example, there are boost binaries for all of the major versions of MSVC.


(来自 this SO answer)
那么 C++ 是否有稳定的 ABI?
如果是这样,我是否可以在同一平台(例如 Windows 上的 VC++ 和 GCC)上混合和匹配使用不同工具集编译的可执行文件和库?如果没有,有没有办法做到这一点?
更重要的是,如果 C++ 中没有稳定的 ABI,为什么人们如此担心破坏它?

最佳答案

尽管 C++ 标准没有规定任何 ABI,但一些实际实现努力尝试保持工具链版本之间的 ABI 兼容性。例如。使用 GCC 4.x,可以使用链接到旧版本 libstdc++ 的库。 ,来自一个由较新的工具链编译的程序,带有较新的 libstdc++ .库所需符号的旧版本由较新的 libstdc++.so 提供。 , 和 C++ 标准库中定义的类的布局是相同的。
但是当 C++11 向 std::string 引入新的要求时和 std::list ,这些无法在 libstdc++ 中实现无需更改这些类的布局。这意味着,如果您不使用 _GLIBCXX_USE_CXX11_ABI=0 kludge使用 GCC 5 及更高版本,您无法通过,例如std::string GCC4 编译的库和 GCC5 编译的程序之间的对象。所以ABI被打破了。
一些 C++ 实现并没有那么努力地拥有兼容的 ABI:例如MSVC++ 不提供主要编译器版本之间的这种兼容性(请参阅 this question ),因此必须提供不同版本的库以与不同版本的 MSVC++ 一起使用。
因此,通常情况下,即使是同一工具链的不同版本编译的库和可执行文件也不能混合和匹配。

关于c++ - 请解释C++ ABI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67839008/

相关文章:

c++ - 可以将 MFC 对话框资源附加到 CChildView 吗?

c++ - std::chrono & Boost.Units

C++ 和二进制兼容性 : returning a POD struct by value

windows - "ABI-volatile"寄存器被视为跨函数调用的非 volatile

c++ - Visual Studio 2012 更新是否会破坏 C++ ABI?

c++ - 如果 try-catch block 被证明是非抛出的,编译器必须始终删除它

c++ - a.out linux 可执行文件属于哪个程序?

c++ - C++ 中的删除运算符是否需要正确的类型?

c - 从 C 传递到 Assembly 的 Int 参数丢失其符号

c++ - 我可以在 DLL 中组织类吗?