如果clang ++和g ++不兼容ABI,则二进制共享库使用什么?

安德鲁·瓦格纳

根据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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

用不同的C ++编译器构建的二进制文件和库如何兼容?

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

如何将版本信息嵌入共享库和二进制文件?

Clang,LLVM和g ++

如果二进制是0和1,为什么在二进制文件和程序中看到类似\ x8c \ x8e \ xfc \ r \ xc3 \ x8a的内容?

特征和接口是否二进制兼容?

clang(和LLVM)与gcc / g ++有什么区别?

Uniscan:可装载的库和Perl二进制文件不匹配

可加载库和Perl二进制文件不匹配

clang / g ++与私有继承和使用声明的区别

数据类型“ DT_WSTR”和“ DT_I4”与二进制运算符“ ==”不兼容

Rust 中的二进制文件和库文件有什么区别?

二进制文件和库之间有什么区别?

VS2010和VS2012之间的二进制C ++库兼容性?

简单的方法来保证C ++库和C链接的二进制兼容性?

如何在二进制文件中包含共享库依赖项(不使用.deb或.rpm),和/或静态链接到PulseAudio?

clang可以在同一运行中产生AST转储和二进制文件吗

如何将所有依赖项和共享库编译为一个二进制文件

了解g ++,clang和llvm

如何使用相同的配置选项构建二进制文件和库?

我可以使用同名的库和二进制文件吗?

xcode:添加链接器标志和“使用库链接二进制文件”之间的区别

如何使C ++(共享)库与clang和GCC兼容?

使用Django和PostgreSQL查询二进制数据

仅使用 ~ 和 | 制作二进制 & 函数

是什么决定了Linux上共享库的二进制兼容性?

为什么从Ubuntu软件包的Gradle二进制文件生成Gradle Wrapper JAR校验和不匹配

Redhat“二进制DVD”和“更新二进制DVD”之间有什么区别?

符号链接会发生什么?原始二进制文件和符号二进制文件的行为不同