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 ++,绝大多数时候,一切都会工作.