描述:
clang-Clang C,C ++和Objective-C编译器。
clang是一个C、c++和Objective-C编译器,它包含预处理、解析、优化、代码生成、汇编和链接。根据传递的高级模式设置,Clang会在完成完整链接之前停止。尽管Clang是高度集成的,但重要的是了解编译的阶段,了解如何调用它。这些阶段是:
驱动:
clang可执行文件实际上是一个小型驱动程序,它控制其他工具(如编译器、汇编器和链接器)的整体执行。通常您不需要与驱动程序交互,但是您可以透明地使用它来运行其他工具。
预处理:
此阶段处理输入源文件的标记化,宏扩展,#include扩展以及其他预处理程序指令的处理。该阶段的输出通常称为“ .i”(对于C),“.ii”(对于C ++),“.mi”(对于Objective-C)或“ .mii”(对于Objective-C ++)文件 。
解析和语义分析:
此阶段解析输入文件,将预处理器令牌转换为解析树。一旦采用了语法分析树的形式,它就会应用语义分析来计算表达式的类型,并确定代码是否格式正确。该阶段负责生成大多数编译器警告以及解析错误。该阶段的输出是“抽象语法树”(AST)。
代码生成和优化:
此阶段将AST转换为低级中间代码(称为“ LLVM IR”),最终转换为机器代码。此阶段负责优化生成的代码并处理特定于目标的代码生成。该阶段的输出通常称为“ .s”文件或“ assembly”文件。
Clang还支持使用集成汇编器,在该汇编器中,代码生成器直接生成目标文件。这避免了生成“ .s”文件和调用目标汇编程序的开销。
汇编程序:
此阶段运行目标汇编程序,以将编译器的输出转换为目标目标文件。该阶段的输出通常称为“ .o”文件或“ object”文件。
链接器:
此阶段运行目标链接程序,以将多个目标文件合并到可执行文件或动态库中。此阶段的输出通常称为“ a.out”,“。dylib”或“ .so”文件。
clang静态分析器:
Clang静态分析器是一种工具,可扫描源代码以尝试通过代码分析来发现错误。该工具使用了Clang的许多部分,并内置在同一驱动程序中。有关如何使用静态分析器的更多详细信息,请参见<https://clang-analyzer.llvm.org>。
选项:
阶段选择选项:
-E
运行预处理器阶段。
-fsyntax-only
运行预处理器、解析器和类型检查阶段。
-S
运行前面的阶段以及LLVM生成和优化阶段以及特定于目标的代码生成,从而生成一个程序集文件。
-c
运行上述所有程序,再加上汇编程序,生成一个目标”.o”对象文件。
无阶段选择选项:
如果没有指定阶段选择选项,则运行上述所有阶段,并运行链接器将结果合并到可执行库或共享库中。
语言选择和模式选项:
-x <language>
将后续的输入文件视为具有类型语言。
-std=<standard>
指定要编译的语言标准。
C语言支持的值有:c89, c90,iso9899:1990…
-stdlib=<library>
指定要使用的c++标准库;支持的选项是libstdc++和libc++。如果未指定,将使用平台默认值。
-rtlib=<library>
指定要使用的编译器运行时库;支持的选项是libgcc和compiler-rt。如果未指定,将使用平台默认值。
-ansi
与-std = c89相同。
-ObjC,-ObjC++
将源输入文件分别视为Objective-C和object - c++输入。
-trigraghs
启用trigraghs
-ffreestanding
指示该文件应针对独立环境而非托管环境进行编译。
-fno-builtin
禁用strlen()和malloc()等内置函数的特殊处理和优化。
-fmath-errno
指出应该将数学函数视为更新errno。
-fpascal-strings
使用" \pfoo"启用pascal风格的字符串支持。
-fms-extensions
启用对Microsoft扩展的支持。
-fmsc-version=
设置_MSC_VER。在Windows上默认为1300。否则不设置。
-fborland-extensions
启用对Borland扩展的支持。
-fwritable-strings
将所有字符串文字默认设置为可写。这将禁用字符串唯一化和其他优化。
-flax-vector-conversions
允许使用松散的类型检查规则进行隐式矢量转换。
-fblocks
启用“阻止”语言功能。
-fobjc-abi-version=version
选择要使用的Objective-CABI版本。可用版本为1(旧式“脆弱” ABI),2(非脆弱ABI 1)和3(非脆弱ABI 2)。
-fobjc-nonfragile-abi-version=<version>
选择默认使用的Objective-C非脆弱ABI版本。只有当非脆弱ABI被启用时,这个才会被用作Objective-C ABI(通过-fobjc-nonfragile-abi,或者因为它是平台默认值)。
-fobjc-nonfragile-abi,-fno-obj-nonfragile-abi
启用Objective-C非脆弱ABI。在默认ABI的平台上,可以用-fno-objc-nonfragile-abi禁用它。
目标选择选项:
Clang完全支持交叉编译作为其设计的固有部分。根据您的Clang版本的配置方式,它可能支持许多交叉编译器,或者仅支持本机目标。
-target <architecture>
指定要为其构建的体系结构。
--print-supported-cpus
打印出给定目标支持的处理器列表(通过-target =<architecture>或-arch<architecture>指定)。如果没有指定目标,将使用系统默认目标。
-mcpu=?,-mtune=?
–print-supported-cpus的别名
-march=<cpu>
指定Clang应该为特定处理器家族成员和更高版本生成代码。例如,如果指定-march = i486,则允许编译器生成在i486和更高版本的处理器上有效的指令,但在较早版本的处理器上可能不存在。
代码生成选项:
-O0, -O1, -O2, -O3, -Ofast,-Os, -Oz, -Og, -O, -O4
指定使用哪个优化级别:
-O0
意味着“无优化”:这个级别编译速度最快,生成的调试代码最多。
-O1
在-O0和-O2之间。
-O2
中等水平的优化,支持大多数优化。
-O3
与-O2相似,不同之处在于它可以使优化执行的时间更长或可能生成更大的代码(以使程序运行更快)。
-Ofast
启用-O3中的所有优化以及可能违反严格遵守语言标准的其他激进优化。
-Os
比如-O2,通过额外的优化来减少代码大小。
-Oz
比如-Os(也就是-O2),但是进一步减少了代码大小。
-Og
像-O1。在将来的版本中,此选项可能会禁用不同的优化,以提高可调试性。
-O
相当于- O2。
-O4 and higher
目前相当于-O3
-g,-gilne-tables-only,-gmodules
控制调试信息输出。注意,Clang调试信息在-O0下工作得最好。当指定多个以-g开头的选项时,最后一个将生效:
-g
生成调试信息
-gline-tables-only
只生成行表调试信息。这允许使用内联信息进行符号化回溯,但不包括关于变量、变量位置或类型的任何信息。
-gmodules
生成包含对Clang模块或预编译头中定义的类型的外部引用的调试信息,而不是将冗余的调试类型信息发送到每个目标文件中。此选项透明地将Clang模块格式切换为将Clang模块与调试信息一起保存的目标文件容器。当编译使用Clang模块或预编译头文件的程序时,此选项将生成具有更快的编译时间和更小的目标文件的完整调试信息。在构建静态库以分发给其他计算机时,不应使用此选项,因为调试信息将包含引用将库中的目标文件建立在机器上的模块高速缓存中。
-fstandalone-debug-fno-standalone-debug
Clang支持许多优化以减少二进制文件中调试信息的大小。它们的工作原理是,调试类型信息可以分布在多个编译单元上。例如,Clang不会为模块不需要的类型发出类型定义,而可以用前置声明代替。此外,Clang将仅在包含该类的vtable的模块中为动态C ++类发出类型信息。
-fstandalone-debug选项关闭这些优化。当使用不带调试信息的第三方库时,这很有用。这是Darwin的默认设置。请注意,对于程序完全未引用的类型,Clang永远不会发出类型信息。
-fexceptions
启用展开信息的生成。这允许通过Clang编译堆栈帧引发异常。在x86-64中默认情况下处于启用状态。
-ftrapv
生成代码以捕获整数溢出错误。C中未定义有符号整数溢出。使用此标志,将生成额外的代码来检测此情况并在发生时中止。
-fvisibility
此标志设置默认可见性级别。
-fcommon,-fno-common
此标志指定没有初始化式的变量具有公共链接。它可以用-fno-common禁用。
-ftls-model=<model>
设置用于线程局部变量的默认线程局部存储(TLS)模型。有效值为:" global-dynamic ", " local-dynamic ", "initial-exec "和" local-exec "。默认是“global-dynamic”。可以使用tls_model属性重写默认模型。如果可能的话,编译器将尝试选择一个更有效的模型。
-flto,-flto=full,-flto=thin,-emit-llvm
生成LLVM格式的输出文件,适用于链接时间优化。与-S一起使用时,将生成LLVM中间语言汇编文件,否则将生成LLVM位代码格式的目标文件(取决于阶段选择选项,可以将其传递给链接器)。
-flto的默认值为“ full”,其中LLVM位代码适用于整体式链接时间优化(LTO),其中链接程序将所有此类模块合并为单个组合模块以进行优化。如果使用“ thin”,则会调用ThinLTO编译。
驱动程序选项:
-###
打印(但不要运行)要为此编译运行的命令。
--help
显示可用的选项。
--Qunused-arguments
不要为未使用的驱动程序参数发出任何警告。
-Wa,<args>
将args中以逗号分隔的参数传递给汇编程序。
-Wl,<args>
将args中以逗号分隔的参数传递给链接器。
-Wp,<args>
将args中逗号分隔的参数传递给预处理器。
-Xanalyzer <arg>
将arg传递给静态分析器。
-Xassembler <arg>
将arg传递给汇编程序。
-Xlinker <arg>
将参数传递给链接器。
-Xpreprocessor <arg>
将参数传递给预处理器。
-o <file>
将输出写入文件
-print-file-name=<file>
打印文件的完整库路径。
-print-libgcc-file-name
打印当前使用的编译器运行时库的库路径(“ libgcc.a”或“ libclang_rt.builtins.*.a”)。
-print-prog-name=<name>
打印名称的完整程序路径。
-print-search-dirs
打印用于查找库和程序的路径。
-save-temps
保存中间编译结果。
-save-stats,-save-stats=cwd,-save-stats=obj
将内部代码生成(LLVM)统计数据保存到当前目录(-save-stats/ " -save-stats=cwd ")或输出文件目录(" -save-state=obj ")中的一个文件中。
-integrated-as,-no-integrated-as
分别用于启用和禁用集成汇编程序的使用。默认情况下,集成汇编程序是否打开取决于目标。
-time
为单个命令计时。
-ftime-report
打印每个编译阶段的时序摘要
-v
显示运行和使用详细输出的命令。
诊断选项:
-fshow-column,-fshow-source-location,-fcaret-diagnostics,-fdiagnostics-fixit-info,-fdiagnostics-parseable-fixits,-fdiagnostics-print-source-range-info,-fprint-source-range-info,-fdiagnostics-show-option,-fmessage-length
这些选项控制Clang如何打印诊断信息(错误和警告)。有关更多信息,请参阅Clang用户手册。
预处理选项:
-D<macroname>=<value>
将一个隐式#define添加到预定义缓冲区中,该缓冲区在对源文件进行预处理之前会被读取。
-U<macroname>
将一个隐式#undef添加到预定义缓冲区中,该缓冲区在对源文件进行预处理之前会被读取。
-include <filename>
将一个隐式#include添加到预定义缓冲区中,该缓冲区在对源文件进行预处理之前已被读取。
-I<directory>
将指定目录添加到包含文件的搜索路径。
-F<directory>
将指定的目录添加到框架包含文件的搜索路径中。
-nostdinc
不要在标准系统目录或编译器内置目录中搜索包含文件。
-nostdlibinc
不要在标准系统目录中搜索包含文件,而要搜索编译器内置的包含目录。
-nobuiltininc
不要在clang的内置目录中搜索包含文件。
网友评论