我如何找出我正在使用 Apple 的 Clang 编译的 ARM 变体?

How do I find out what variation of ARM I'm compiling for with Apple's Clang?

我正在使用 clang 从 C 和 C++ 代码构建 iOS 软件(在命令行 - 出于好的但复杂的原因),并且想知道编译器针对的是 ARMv8 的哪个变体(例如, 8、8.3 等)。一个相关的问题:clang how to list supported target architectures,但很多答案依赖于 llc 等工具,Apple 的 Xcode.

中没有提供这些工具。

这很简单,一旦您了解了操作方法。一个有用的工具是绝对最小的 C 程序,不包含:

main( int argc, char *argv[]) 
{
    return 0;
}

使用 --verbose 选项编译它,这会使编译器产生大量关于其工作的输出。例如,

clang -arch arm64 -fexceptions -std=c99 --verbose minimal_c_program_with_no_includes.c

实际上是针对 ARM macOS 的编译,并产生以下输出:

-triple arm64-apple-macosx11.0.0 -main-file-name minimal_c_program_with_no_includes.c  
-target-sdk-version=11.0 -target-cpu vortex -target-feature +v8.3a 
-target-feature +fp-armv8 -target-feature +neon

而 iOS 14 及更高版本的编译:

clang -arch arm64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk
-mios-version-min=14.0 -fexceptions -std=c99 --verbose minimal_c_program_with_no_includes.c

产生:

-triple arm64-apple-ios14.0.0 -main-file-name minimal_c_program_with_no_includes.c 
-target-sdk-version=14.2 -target-cpu apple-a7 -target-feature +fp-armv8 
-target-feature +neon

-target-sdk-version 值是因为我使用的是 Xcode 12.2,它有 iOS 14.2 SDK。