Name:
clang - C、C++、 Object 等语言的编译器
SYNOPSIS: 概述
clang [option] filename ....
DESCRIPTION: 描述
clang 是一个包含了 预编译、语法分析、编译优化、代码生成(个人理解语法树?(AST)\中间代码IR?)、程序集、链接的 C、C++、Object-C的编译器。在整个链接过程完成之前可以通过一些配置来停止在某个过程。由于clang是一款高度集成的编译器,理解其中具体的编译阶段是非常重要的,理解怎么调用它,其中有以下几个阶段:
Driver (驱动):
clang 实际上是一个小的驱动程序,通过控制其他如编译器、汇编器、链接器的一个综合执行工具。通常你不会和驱动打交道,但是你可以通过它来使用其他工具。
PreProcessing(预编译):
这个阶段会进行词法解析、宏定义展开 #include 头文件展开以控制另一些预编译的指令,这个阶段输出的文件格式是 .i(C), .ii(C++), .mi(Object-C) 或者 .mii(Object-C++)。
Parsing and Semantic Analysis(句法和语法解析):
这个阶段分析输入文件、把预编译阶段的tokens 词 转换成成语法树(AST). 在语法树格式下,就可以用语法解析规则来确定表达式或者代码段是否是正确格式。这个阶段负责生产大部分警告或者错误。这个阶段的输出就是语法树
Code Generation and Optimization(中间码生产和优化):
这个阶段将AST 转换成低层级的中间码形式(为人熟知的LLVM IR),最终生产机械码。这个阶段负责针对中间码进行优化然后转换生产具体的目标代码。这个阶段输出的文件格式是 .s, 或者叫程序集。(程序集概念这个时候不太明白)
clang也支持使用集成的汇编程序,其中代码生成器会直接生成目标程序,这就会省掉生成.s文件或者目标程序集
Assembler(汇编):
这个阶段运行目标汇编器者将编译器输出的文件(理解就是上一步生成的.s或者程序集)转换为目标程序。这个阶段生成的文件后缀为.o或者是目标文件
Linker(链接):
这个阶段运行目标链接器去合并多个目标程序成一个可执行文件或者动态库。这个阶段输出成为a.out,.dylib或者.so文件
一些参数含义可以在这里搜索到,应该是需要翻墙。
OPTIONS
可选的阶段(参数):
-E 运行 预编译阶段
-fsyntax-only 运行预编译、语法机洗和类型检查
-S 运行前面的阶段以及生成和优化目标代码,生成程序集文件
-c 运行上述所有的阶段,加上汇编器,生成目标.o文件
没有选择任何控制阶段(参数): 如果没有选择任何参数选项,执行上述所有的阶段,并且进行连接生成可执行文件或者共享库(动态共享库?)
语言和模式可选参数:
-x <language> 后续文件视为支持特定类型的标准语言
-std=<standard> 编译器支持的标准语言
支持C语言的值有:
C89、C90,iso9899:1990 。。。 (后面太多的标注语言类型,不一一列出了,没什么太大意义。)
C默认的标准语言是gnu11,除了PS4之外,它默认的是gnu99
支持的C++语言标准: c++98、c++03 ....
C++ 默认支持的是gnu++14
OpenCl支持的语言:Opencl1.0、Opencl1.1...
OpenCl默认支持的是openCl1.0.
-stdlib=<libary> : 指定C++标准库的,支持 libstdc++和 libc++。缺省使用平台自己默认的库。
-rtlib=<library>: 指定编译器运行时库;支持libgcc 和compiler-rt,缺省使用平台默认
-ansi 和 -std=c89一样(单独列出来有点没头没脑的,为了方便还是妥协因素?)
-ObjeC, -ObjeC++: 源文件是 ObjectC 和ObjectC++
-trigraphs: 开启三字符和双字符(自行google了解)
-ffreestanding: 是否是标准库不存在的的环境(设计到操作系统,有点深,搞不明白)。
-fno-builtin: 禁止优化内建函数如 strlen()和malloc()。
-fmath-errno: 调用标准数学函数需要检测是否会发生错误
-fpascal-strings: 支持pascal-style 格式字符串"\pfoo"
-fms-extensions:支持Microsoft 扩展(还是微软牛 -_-)
-fmsc-version=: _MSC_VER微软编译器版本宏,默认是1300
-fborland-extensions: 支持 borland(一家公司)的扩展
-fwritable-strings: 支持字c符串可修改选项,具体可以看看这段代码,使用clang 编译时候加上和不加上这个选项会有不同效果-_-!
-flax-vector-conversions: 允许隐式向量转换的松散规则检查
-fblocks: 是苹果的blocks 被识别
-fobjc-abi-version=version: 选择Object-C ABI版本,可用的版本1(不稳定ABI),2(稳定的ABI 1),3(稳定的ABI 2)(ABI 可以知乎上搜搜答案,有些回答的挺好)
-fobjc-nonfragile-abi-version=<version>:默认选择Object-C稳定版本的ABI,这个仅会用于Object-C ABI
-fobjc-nonfragile-abi, -fno-objc-nonfragile-abi: 可以使用Object-C 稳定的ABI,在对应的平台上是默认的ABI,-fno 与之相反。
内容翻译的时候才发现不懂的内容太多,耗时在意料之外。 TargetSelectionOptions 下一篇继续翻译!
网友评论