【问题标题】:Is clang++ ABI same as g++? [duplicate]clang++ ABI 和 g++ 一样吗? [复制]
【发布时间】:2012-07-25 20:00:23
【问题描述】:

可能重复:
GCC 4.0, 4.2 and LLVM ABI Compatibility

根据主题,这两个 C++ ABI 是否兼容?
IE。前者生成的二进制文件(共享对象)能否与后者关联(反之亦然)?

干杯

【问题讨论】:

  • 这里非常普遍的答案是否定的。但我认为这将取决于您正在编译什么以及用于什么架构。
  • 我想我的问题不只是与 libstdc++ 兼容性有关,甚至是你自己的 C++ 共享对象.
  • 现在:llvm.org/bugs/show_bug.cgi?id=23529。 gcc 5.1引入了一个新的abi,clang还没有实现

标签: c++ linux gcc clang


【解决方案1】:

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

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

这似乎暗示他们的目标不是 100% 兼容性。例如,在该页面上,他们还说:

根据多年的经验(包括之前实现过标准库),我们已经了解了很多关于实现标准容器的知识,这些知识需要破坏 ABI 并从根本上改变它们的实现方式。例如,人们普遍认为,使用“短字符串优化”而不是使用写时复制 (COW) 构建 std::string 对于多核机器来说是一种优越的方法(特别是在具有右值引用的 C++'0x 中)。打破 ABI 与旧版本库的兼容性对于实现 libc++ 的性能目标至关重要。

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

【讨论】:

  • VC++也一样。 “在每个主要版本(VS 2005、2008、2010、2012 等)中,我们都会更改 STL 对象(如字符串和向量)的表示,使它们与二进制不兼容。我们现在有链接器检查,可防止混合编译的目标文件/静态库具有不同的主要版本(2010+)...”(见social.msdn.microsoft.com/forums/en-us/vcgeneral/thread/…
  • 我想 C ABI 是 100% 兼容的,对吧?
  • 我认为 libc++ 与 Clang 不同。为什么 anwser 关注标准库兼容性,而不是语言二进制兼容性?很明显它们对方法使用相同的调用约定,它们在堆栈上返回对象并且通常在语言级别上是二进制兼容的?
  • 正如上面的评论正确指出的那样,标准库的ABI兼容性与编译器的ABI不一样。例如clang++ -stdlib=libstdc++ 将生成与 g++ 100% ABI 兼容的代码。但是现在,clang 默认使用-stdlib=libc++(而不是stdlibc++)。所以——尽管它在发布时是错误的——但这个答案在随后的几年里意外地变得正确,至少在 OSX 上是这样。 (写这个答案时,clang 的默认设置是-stdlib=libstdc++,所以二进制文件默认与 g++ 兼容。)
  • 顺便说一句,由于 gcc 5.1 libstdc++ 不再默认为 COW 字符串,因为 C++11 禁止它们,从而更改了 ABI。 (一些发行版,例如 Slackware,继续使用旧的 ABI)。 libstdc++ continues to support both ABIs 但您不能将目标文件/库(除了 libstdc++)与不同的 ABI 混合在一起。
【解决方案2】:

它似乎是兼容的。 Clang 也有一个他们自己的 C++ 运行时项目,它声明它是low-level compatible 与 GNU stdlibc++。我只是尝试了一个小示例程序,其中我用clang++编译了一个文件,并编译并链接了主程序和g++。目前没有问题,但程序相当简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-11
    • 1970-01-01
    • 2015-12-03
    • 2011-11-28
    • 2020-04-10
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多