Apple clang编译器版本架构?

las*_*ote 19 c++ xcode abi clang clang++

前段时间,GCC> = 5Clang> = 4编译器改变了他们的版本号的语义,因此任何非bugfix版本的主版本号都会增加.

Apple在ABI兼容性或任何其他范围方面是否遵循任何带有clang编译器的版本模式?我想知道apple-clang 9.0ABI是否兼容9.1等等.

Tob*_*obi 3

Apple 在每个 Xcode 版本中都会更改其编译器版本号,因此查找 ABI 更改的适当位置是Xcode 发行说明。我能找到的最新 ABI 更改是 Xcode 6:

Xcode 6 中的 libc++ 头文件进行了更改,使 std::pair 具有简单的构造函数。此修复对于性能和符合 C++ 标准非常重要,但它更改了使用 std::pair 的 C++ 代码的 ABI。

这意味着自 2014 年以来 ABI 没有发生变化。

编辑:clang 和 apple-clang 之间的映射似乎是(取自此处并通过功能测试自己添加了最后一行):

5.1 -> 3.4
6.0 -> 3.5
7.0 -> 3.7
7.3 -> 3.8
8.0 -> 3.9
9.0 -> 4.0
9.1 -> 5.0
Run Code Online (Sandbox Code Playgroud)

所以我猜苹果每当在主要 Xcode 版本之间集成主线 clang 的更改时都会升级 apple-clang 的次要版本。

但对于最初的问题来说,这并不重要:除非他们这么说,否则语言的 ABI 兼容性不会改变,这对于标准库来说是可能的(但很少发生),而对于核心语言来说几乎是不可想象的。对于 GCC,苹果甚至保证不会做后者,但可能在切换到 clang 时忘记更新文档:

由于 GCC 4.0 符合 Itanium C++ ABI,因此 C++ 对象与符合此规范的其他 OS X 编译器构建的对象是链接兼容的。Apple 保证 OS X 的 GCC 未来版本也将符合 Itanium C++ ABI。这意味着开发人员可以安全地发布其接口涉及 C++ 类的动态共享库,尽管有一些注意事项:

  • Apple 仅保证核心语言功能的 ABI 稳定性。它不保证库类的稳定性,包括 std::string、std::map 和 std::ostream 等。

但由于该gcc命令通过任何最近安装的 Xcode 链接到 apple-clang,因此这一保证也适用于后者。