根据主题,两个 C++ ABI 是否兼容?
即可以使用由前者生成的二进制文件(共享对象)并与后者链接(反之亦然)?
干杯
根据clang libc++ page,他们的目标是
ABI 与 gcc 的 libstdc++ 的一些低级功能的兼容性,例如异常对象、rtti 和内存分配。
这似乎暗示他们的目标不是 100% 兼容性。例如,在该页面上,他们还说:
从多年的经验(包括之前实现过标准库)中,我们学到了很多关于实现标准容器的知识,这需要破坏 ABI 以及对它们的实现方式进行根本性的改变。例如,人们普遍认为,使用“短字符串优化”而不是使用写时复制 (COW) 构建 std::string 对于多核机器来说是一种优越的方法(特别是在具有右值引用的 C++'0x 中)。打破 ABI 与旧版本库的兼容性对于实现 libc++ 的性能目标至关重要。
我相信 GCC 仍在使用引用计数的 COW,因此 clang 似乎并不担心 ABI 与std::string
(与较旧的 clang 编译的二进制文件或与 GCC)的兼容性。
它似乎是兼容的。Clang 也有一个针对他们自己的 C++ 运行时的项目,它声明它与 GNU stdlibc++低级兼容。我只是尝试了一个小示例程序,其中我用clang++编译了一个文件,并编译并链接了主程序和g++。到目前为止没有问题,但程序相当简单。