如果 clang++ 和 g++ 是 ABI 不兼容的,那么二进制共享库使用什么?
If clang++ and g++ are ABI incompatible, what is used for shared libraries in binary?
clang++ 和 g++ 是 ABI 不兼容的,即使对于标准容器这样的核心事物,例如,根据 clang++ 网站。
Debian 附带 C++ 共享库,即 libboost 等...,它们是用~something 编译的,使用这两种编译器的用户程序通常都可以工作,并且库名称不会与用于它们的编译器混淆.当您安装 clang 时,debian 不会去提取系统上安装的每个 C++ 库的重复版本。
怎么回事? clang link 对抗发行版提供的 C++ 库的能力是否比编译器开发人员描述的(谢天谢地谨慎)强得多?
这可能无法正确回答确切的问题:
前段时间我尝试用 gcc 编译一些目标文件,另一个目标文件用 clang。最后,我将所有内容链接在一起并且工作正常。
我相信 Linux 发行版使用 gcc,因为我检查了 Ubuntu 和 CentOS 的一些 Makefile,他们使用 gcc。
G++ 和 Clang 对绝大多数人来说是完全 ABI 兼容的。此外,标准容器的 ABI 不兼容性是标准库实现(libstdc++ 或 libc++)的属性,而不是编译器的属性。因此,无需重新编译。
如果 Clang 与 g++ 的 ABI 不兼容,它就永远不会起步,因为如果没有预先存在的大量追随者,它基本上是无法使用的。事实上,Clang 与 GCC 非常兼容,它们几乎模仿了 g++ 的所有命令行界面、编译器内部函数、错误等,因此您可以直接使用 Clang 而不是 G++,并且在绝大多数情况下,一切都会只是工作。
even for things as core as standard containers
标准容器并非全部"core"。 (对于典型实现)它们在 headers 中完全用有效的 C++ 实现,如果您使用 G++ 和 Clang++ 编译相同的 headers,您将获得 ABI 兼容的输出。如果您使用不同版本的容器 headers,您应该只会遇到不兼容问题 "even for things as core as standard containers",而不仅仅是使用 Clang 而不是 GCC。
GCC 和 Clang 都符合 cross-vendor、cross-platform C++ ABI(最初是为 Itanium 架构开发的,但也用于 x86、x86_64、SPARC 等.) 真正 核心的东西,例如 class 布局、名称修改、异常处理、vtables 等,由 ABI 指定,Clang 和 GCC 都遵循它。
换句话说,如果您使用 GCC 和 Clang 编译相同的源代码,您将获得 ABI-compatible 个二进制文件。
如果您想更好地理解这些内容,请参阅我的 What's an ABI and why is it so complicated? 幻灯片。
clang++ 和 g++ 是 ABI 不兼容的,即使对于标准容器这样的核心事物,例如,根据 clang++ 网站。
Debian 附带 C++ 共享库,即 libboost 等...,它们是用~something 编译的,使用这两种编译器的用户程序通常都可以工作,并且库名称不会与用于它们的编译器混淆.当您安装 clang 时,debian 不会去提取系统上安装的每个 C++ 库的重复版本。
怎么回事? clang link 对抗发行版提供的 C++ 库的能力是否比编译器开发人员描述的(谢天谢地谨慎)强得多?
这可能无法正确回答确切的问题:
前段时间我尝试用 gcc 编译一些目标文件,另一个目标文件用 clang。最后,我将所有内容链接在一起并且工作正常。
我相信 Linux 发行版使用 gcc,因为我检查了 Ubuntu 和 CentOS 的一些 Makefile,他们使用 gcc。
G++ 和 Clang 对绝大多数人来说是完全 ABI 兼容的。此外,标准容器的 ABI 不兼容性是标准库实现(libstdc++ 或 libc++)的属性,而不是编译器的属性。因此,无需重新编译。
如果 Clang 与 g++ 的 ABI 不兼容,它就永远不会起步,因为如果没有预先存在的大量追随者,它基本上是无法使用的。事实上,Clang 与 GCC 非常兼容,它们几乎模仿了 g++ 的所有命令行界面、编译器内部函数、错误等,因此您可以直接使用 Clang 而不是 G++,并且在绝大多数情况下,一切都会只是工作。
even for things as core as standard containers
标准容器并非全部"core"。 (对于典型实现)它们在 headers 中完全用有效的 C++ 实现,如果您使用 G++ 和 Clang++ 编译相同的 headers,您将获得 ABI 兼容的输出。如果您使用不同版本的容器 headers,您应该只会遇到不兼容问题 "even for things as core as standard containers",而不仅仅是使用 Clang 而不是 GCC。
GCC 和 Clang 都符合 cross-vendor、cross-platform C++ ABI(最初是为 Itanium 架构开发的,但也用于 x86、x86_64、SPARC 等.) 真正 核心的东西,例如 class 布局、名称修改、异常处理、vtables 等,由 ABI 指定,Clang 和 GCC 都遵循它。
换句话说,如果您使用 GCC 和 Clang 编译相同的源代码,您将获得 ABI-compatible 个二进制文件。
如果您想更好地理解这些内容,请参阅我的 What's an ABI and why is it so complicated? 幻灯片。