clang ++ ABI和g ++一样吗?

Ema*_*ele 18 c++ linux gcc clang

可能重复:
GCC 4.0,4.2和LLVM ABI兼容性

根据主题,C++ ABI兼容吗?
即,可以使用前者生成的二进制(共享对象)并与后者链接(反之亦然)?

干杯

Mic*_*urr 16

根据clang libc ++页面,他们的目标是

ABI与gcc的libstdc ++兼容,用于一些低级功能,例如异常对象,rtti和内存分配.

这似乎意味着他们没有针对100%的兼容性.例如,在该页面上,他们还说:

凭借多年的经验(包括之前已经实施过标准库),我们学到了许多关于实现标准容器的事情,这些容器需要ABI破坏并对其实现方式进行根本性改变.例如,通常认为使用"短字符串优化"而不是使用写入时复制(COW)构建std :: string对于多核机器来说是一种更好的方法(特别是在C++'0x中,它具有右值引用).打破ABI与旧版本库的兼容性对于实现libc ++的性能目标至关重要.

我相信GCC仍在使用引用计数的COW,因此看起来clang并不担心ABI兼容std::string(与旧的clang编译的二进制文件或GCC).

  • 我认为`libc ++`和Clang不一样.为什么anwser专注于标准库兼容性,而不是语言二进制兼容性?很明显,他们对方法使用相同的调用约定,它们在堆栈上返回对象并且通常在语言级别上是二进制兼容的吗? (10认同)
  • 与VC++相同."在每个主要版本(VS 2005,2008,2010,2012等)中,我们更改STL对象的表示形式,如字符串和向量,使它们二进制不兼容.我们现在有链接器检查,防止混合目标文件/静态库编译不同的主要版本(2010 +)......"(见http://social.msdn.microsoft.com/forums/en-us/vcgeneral/thread/8F2843AE-010D-4440-AD1B-9F021BB74C2E) (4认同)
  • 正如上面的注释正确指出的那样,标准库的ABI兼容性与编译器的ABI不同.例如`clang ++ -stdlib = libstdc ++`将生成与g ++ 100%ABI兼容的代码.但是现在,clang默认使用`-stdlib = libc ++`(而不是`stdlibc ++`).所以 - 虽然它在发布时是错误的 - 但在这几年中,这个答案偶然变得正确,至少在OSX上.(当写这个答案时,clang的默认设置是`-stdlib = libstdc ++`,所以二进制文件默认与g ++兼容.) (4认同)