如果clang ++和g ++是ABI不兼容的,那么二进制文件中的共享库使用了什么?

And*_*ner 22 c++ shared-libraries abi

clang ++和g ++是ABI不兼容的,即使对于像标准容器这样的核心东西,例如clang ++网站.

Debian附带了C++共享库,即libboost等...使用两种编译器编译的东西和用户程序通常都可以工作,并且库名称不会被用于它们的编译器损坏.当你安装clang时,debian不会去你系统上安装的每个C++库的重复版本.

这是怎么回事?clang与发行版提供的C++库链接的能力是否比编译器开发人员描述的那样强大(谢天谢地)?

Jon*_*ely 27

即使是像标准容器那样核心的东西

标准容器并非都是"核心".(对于典型的实现),它们完全在头文件中的有效C++中实现,如果使用G ++和Clang ++编译相同的头文件,您将获得ABI兼容输出.如果您使用不同版本的容器标头,而不仅仅是使用Clang而不是GCC,那么您应该只"兼容"标准容器的核心内容".

GCC和Clang都符合跨厂商,跨平台的C++ ABI(最初是为Itanium架构开发的,但也用于x86,x86_64,SPARC等)真正的核心事物,如类布局,名称修改,异常处理ABI指定了vtable等,而Clang和GCC都遵循它.

换句话说,如果你使用GCC和Clang编译相同的源代码,你将获得与ABI兼容的二进制文件.

如果你想了解这些东西,最好看看我的ABI是什么,为什么它如此复杂?幻灯片.


Pup*_*ppy 23

G ++和Clang绝大多数都完全兼容ABI.此外,标准容器的ABI不兼容性是标准库实现(libstdc ++或libc ++)的属性,而不是编译器的属性.因此,不需要任何重新编译.

如果不是ABI与g ++兼容,Clang就永远不会离开地面,因为如果没有预先存在的大型追随者,它将基本上无法使用.实际上,Clang与GCC是如此兼容,它们实际上几乎都是g ++的命令行界面,编译器内在函数,错误等等,所以你可以直接使用Clang而不是G ++,绝大多数时候,一切都会工作.

  • 更正确的是,它是ABI,而不是GCC.安腾ABI独立于GCC. (3认同)