获取Apple clang版本和相应的上游LLVM版本

时间:2015-11-09 05:28:17

标签: c++11 clang c++14 llvm-clang c++17

我想了解哪些版本的clang Apple安装在我的macbook中,可以看到c ++ 11和/或c ++ 14的功能。 我输入了这个命令:

<div class="image">
  <img src="http://lorempixel.com/250/200/sports" />
  <div class="arrow"><span></span></div>
   <div class="image-hover-wrapper">
      Hii 
   </div>
</div>

但我无法理解clang --version //----response Apple LLVM version 7.0.0 (clang-700.1.76) Target: x86_64-apple-darwin15.0.0 Thread model: posix 的含义。 如何将此代码转换为clang版本?

这是您可以检查clang版本http://clang.llvm.org/cxx_status.html

中提供的c ++功能的网站

9 个答案:

答案 0 :(得分:19)

以下是我发现的最佳列表,它将Apple的clang版本与LLVM版本相关联:

https://trac.macports.org/wiki/XcodeVersionInfo

之前的版本曾经说过他们对应的LLVM版本,但从7.0开始,Apple决定不再那样做了。他们甚至定义了__clang_version__和相关的预处理器宏来指示Apple版本号,而不是LLVM版本。所以他们也没用。

不幸的是,看起来你有一个功能的唯一方法是尝试它并检查它是否有效。例如7.0.2默认情况下仍然没有启用OpenMP(尽管它是enable-able),所以我猜它仍然是3.6,而不是3.7。

答案 1 :(得分:12)

维基百科的Xcode页面有a map of Apple to LLVM versions(至少到AppleClang 800.0.42.1为止)。 LLVM列具有开源LLVM / Clang版本。通过此,您可以在cppreference的chart of compiler support for language features中查找语言功能。

答案 2 :(得分:10)

pkolbus所示,您可以查看Object.getOwnPropertyDescriptor(obj, prop) !== undefined 来猜测相应的Clang版本。例如,根据

,Apple Clang 800.0.38800.0.42.1似乎都基于Clang 3.9.0
/src/CMakeLists.txt

答案 3 :(得分:3)

可以尝试使用 - verbose 选项编译某个文件。

例如: c ++ --verbose -c test1.cpp

Apple LLVM version 7.0.2 (clang-700.1.81)
Target: x86_64-apple-darwin14.5.0
Thread model: posix
 "/Library/Developer/CommandLineTools/usr/bin/clang" -cc1 -triple x86_64-apple-macosx10.10.0 -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -main-file-name test1.cpp -mrelocation-model pic -pic-level 2 -mthread-model posix -mdisable-fp-elim -masm-verbose -munwind-tables -target-cpu core2 -target-linker-version 253.9 -v -dwarf-column-info -coverage-file /Users/az/ctest/test1.cpp -resource-dir /Library/Developer/CommandLineTools/usr/bin/../lib/clang/7.0.2 -stdlib=libc++ -fdeprecated-macro -fdebug-compilation-dir /Users/az/ctest -ferror-limit 19 -fmessage-length 130 -stack-protector 1 -mstackrealign -fblocks -fobjc-runtime=macosx-10.10.0 -fencode-extended-block-signature -fcxx-exceptions -fexceptions -fmax-type-align=16 -fdiagnostics-show-option -fcolor-diagnostics -o test1.o -x c++ test1.cpp
clang -cc1 version 7.0.2 based upon LLVM 3.7.0svn default target x86_64-apple-darwin14.5.0

它会打印LLVM svn版本(在我们的示例中为3.7.0)

答案 4 :(得分:1)

编译器的(Apple)版本号通常是无用的,因为您还需要考虑您的代码是使用libstdc++还是使用libc++(或任何其他标准库)编译的 - 以及那些版本。

如果要测试语言或库功能,最好检查其他定义的值,例如__cplusplus__cpp_constexpr__cpp_variadic_templates等。这不是完美的,但是根据我的经验,似乎效果更好(如果你想要可移植性),所有主要编译器的支持都在提高。

每个C ++标准版本都定义了__cplusplus的值,一些编译器使用中间值来表示“我们已经开始使用C ++ 14,但我们还没有”。使用>=在需要时进行测试。

其他功能测试宏类似,您可以在N4440找到当前版本。但并非所有编译器都实现N4440。

答案 5 :(得分:1)

如果在编译器上使用strings命令,则可能会获得LLVM版本。

例如,如果您的clang版本标识为 Apple LLVM版本7.0.2(clang-700.1.81),则字符串的输出将具有此值:

LLVM 3.7.0svn

这似乎不适用于版本 Apple LLVM版本7.3.0(clang-703.0.29)

答案 6 :(得分:1)

首先,我想说Daniel Frey的回答是绝对正确的;您确实应该使用__has_feature__has_extension etc 。若有可能。 Clang Language Extensions页记录了您可以检查的不同内容,这应该是您的首选解决方案。

也就是说,有时候您确实需要检查版本。例如,有时有必要解决已在较新版本中修复或仅在较新版本中出现的编译器错误。有时会添加新功能;例如,在c 9 __builtin_constant_p didn't work correctly with the diagnose_if attribute之前。有时会添加功能,但是没有相应的检查。

我真的希望clang仅将上游版本号公开为预处理程序宏,以便我们能够可靠地处理类似的情况,但事实并非如此。您可以手动创建到上游的Apple版本号的映射,这是其他几个答案所建议的,但是它有一些明显的缺点。对我而言,致命的缺陷是,除了Apple clang之外,它实际上对其他编译器不起作用。如今,有很多基于clang的编译器(IBM XL C / C ++,一些较新的PGI / NVIDIA编译器,下一代Intel C / C ++等)。

我的解决方法是使用功能检测宏来估计版本号。例如,在clang 11中添加了-Wimplicit-const-int-float-conversion,因此,如果__has_warning("-Wimplicit-const-int-float-conversion")为true,我们可以假定上游clang版本是> =11。类似地,clang 10添加了-Wmisleading-indentation,clang 9开始定义__FILE_NAME__预处理器宏,等等。

我创建了a small header,其中包含必要的逻辑。它是公共领域(CC0),尽管它是我的项目(SIMDe)的一部分,但它不依赖任何其他文件,因此您可以随意将其用于自己的项目而不复制所有SIMDe。

显然,该文件需要针对每个版本的clang进行新测试,因此,如果您需要能够检查较新的编译器,则确实需要偶尔进行更新,因此建议您从SIMDe git存储库中获取最新版本(我'不太可能使此答案保持最新状态),但现在的检查结果如下:

#if defined(__clang__) && !defined(SIMDE_DETECT_CLANG_VERSION)
#  if __has_warning("-Wimplicit-const-int-float-conversion")
#    define SIMDE_DETECT_CLANG_VERSION 110000
#  elif __has_warning("-Wmisleading-indentation")
#    define SIMDE_DETECT_CLANG_VERSION 100000
#  elif defined(__FILE_NAME__)
#    define SIMDE_DETECT_CLANG_VERSION 90000
#  elif __has_warning("-Wextra-semi-stmt") || __has_builtin(__builtin_rotateleft32)
#    define SIMDE_DETECT_CLANG_VERSION 80000
#  elif __has_warning("-Wc++98-compat-extra-semi")
#    define SIMDE_DETECT_CLANG_VERSION 70000
#  elif __has_warning("-Wpragma-pack")
#    define SIMDE_DETECT_CLANG_VERSION 60000
#  elif __has_warning("-Wbitfield-enum-conversion")
#    define SIMDE_DETECT_CLANG_VERSION 50000
#  elif __has_attribute(diagnose_if)
#    define SIMDE_DETECT_CLANG_VERSION 40000
#  elif __has_warning("-Wcast-calling-convention")
#    define SIMDE_DETECT_CLANG_VERSION 30900
#  elif __has_warning("-WCL4")
#    define SIMDE_DETECT_CLANG_VERSION 30800
#  elif __has_warning("-WIndependentClass-attribute")
#    define SIMDE_DETECT_CLANG_VERSION 30700
#  elif __has_warning("-Wambiguous-ellipsis")
#    define SIMDE_DETECT_CLANG_VERSION 30600
#  else
#    define SIMDE_DETECT_CLANG_VERSION 1
#  endif
#endif /* defined(__clang__) && !defined(SIMDE_DETECT_CLANG_VERSION) */

我认为此方法的最大问题实际上是与我所知道的所有其他尝试检测上游clang版本的尝试共享的:不一定有与所讨论代码相对应的clang版本。据我所知,大多数基于clang的编译器实际上并非基于发行版,而是一些随机提交(可能是他们想要基于其工作的分支的最新提交)。这意味着,例如,如果在clang $ N开发周期的后期解决了问题,则Apple的fork通常与clang $ N相同,但不包含错误修复程序。相反,也许Apple会从clang $ N + 1向后移植修复程序,而clang $ N中存在的错误将在Apple的版本中修复。

答案 7 :(得分:0)

看看https://en.wikipedia.org/wiki/Xcode#Toolchain_versions

------------------------------------------------------------------------------------ Xcode cctools[93] ld64[94] LLVM[85] Clang version string[95] 8.3.3 898 278.4 3.9.0svn[85] 8.1.0 (clang-802.0.42)[80] 9.0 900 302.3 4.0.0?[86] 9.0.0 (clang-900.0.37)[80] 9.1 900 302.3.1 4.0.0?[87] 9.0.0 (clang-900.0.38)[80] 9.2 900 305 4.0.0?[88] 9.0.0 (clang-900.0.39.2)[80] 9.3 906 351.8 5.0.2?[89] 9.1.0 (clang-902.0.39.1)[80] 9.3.1 906 351.8 5.0.2?[89] 9.1.0 (clang-902.0.39.1)[80] 9.4 906 351.8 5.0.2?[90] 9.1.0 (clang-902.0.39.2)[80] 9.4.1 906 351.8 5.0.2?[90] 9.1.0 (clang-902.0.39.2)[80] 10.0 921.0.1 409.12 6.0.1?[91] 10.0.0 (clang-1000.11.45.2)[80] 10.1 921.0.1 409.12 6.0.1?[92] 10.0.0 (clang-1000.11.45.5)[80]

例如,Apple CLang 10.x基于LLVM 6.0.1。

答案 8 :(得分:0)

如果安装了clion,则在其 preference-toolchains 中,您可能会看到捆绑的LLDB 7.0.1

我相信这是当前的Apple clang版本。 (例如,Apple LLVM版本10.0.1)