根据clang ++网站的说法,clang ++和g ++不兼容ABI,即使对于作为标准容器核心的东西也是如此。
Debian附带了C ++共享库,例如libboost等,它们可以同时通过〜something和用户程序进行编译,并且两者都可以正常工作,并且库名不会被用于它们的编译器所破坏。安装clang时,debian不会删除系统中安装的每个C ++库的重复版本。
这是怎么回事?clang与发行版提供的C ++库链接的能力是否比(非常谨慎的)编译器开发人员所描述的更强大?
即使对于像标准容器一样核心的东西
标准容器并不是所有的“核心”。(对于典型的实现)它们完全在有效的C ++头文件中实现,如果您使用G ++和Clang ++编译相同的头文件,则将获得与ABI兼容的输出。如果您使用不同版本的容器标头,而不仅仅是使用Clang而不是GCC,则应该仅获得“即使对于作为标准容器来说是核心的事物”也不兼容。
GCC和Clang都符合跨供应商,跨平台的C ++ ABI(最初是为Itanium架构开发的,但也用于x86,x86_64,SPARC等)。真正核心的事情包括类布局,名称处理,异常处理,vtable等由ABI指定,Clang和GCC都紧随其后。
因此,换句话说,如果您使用GCC和Clang编译相同的源代码,则将获得与ABI兼容的二进制文件。
如果您想更好地理解这些内容,请参阅“什么是ABI”,为什么它是如此复杂?幻灯片。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句