Name:
? ? clang - C草丧、C++媳维、 Object 等語言的編譯器
SYNOPSIS: 概述
clang [option] filename ....
DESCRIPTION: 描述
clang 是一個包含了 預編譯东跪、語法分析茶袒、編譯優(yōu)化划鸽、代碼生成(個人理解語法樹冗恨?(AST)\中間代碼IR?)檩淋、程序集芬为、鏈接的 C萄金、C++蟀悦、Object-C的編譯器。在整個鏈接過程完成之前可以通過一些配置來停止在某個過程氧敢。由于clang是一款高度集成的編譯器日戈,理解其中具體的編譯階段是非常重要的,理解怎么調(diào)用它孙乖,其中有以下幾個階段:
Driver (驅(qū)動):?
clang 實際上是一個小的驅(qū)動程序浙炼,通過控制其他如編譯器份氧、匯編器、鏈接器的一個綜合執(zhí)行工具弯屈。通常你不會和驅(qū)動打交道蜗帜,但是你可以通過它來使用其他工具。
PreProcessing(預編譯):
? ? 這個階段會進行詞法解析资厉、宏定義展開 #include 頭文件展開以控制另一些預編譯的指令厅缺,這個階段輸出的文件格式是 .i(C), .ii(C++), .mi(Object-C) 或者 .mii(Object-C++)。
Parsing and Semantic Analysis(句法和語法解析):
? ? 這個階段分析輸入文件宴偿、把預編譯階段的tokens 詞 轉(zhuǎn)換成成語法樹(AST). ?在語法樹格式下湘捎,就可以用語法解析規(guī)則來確定表達式或者代碼段是否是正確格式。這個階段負責生產(chǎn)大部分警告或者錯誤窄刘。這個階段的輸出就是語法樹
Code Generation and Optimization(中間碼生產(chǎn)和優(yōu)化): ? ?
? ? 這個階段將AST 轉(zhuǎn)換成低層級的中間碼形式(為人熟知的LLVM IR)窥妇,最終生產(chǎn)機械碼。這個階段負責針對中間碼進行優(yōu)化然后轉(zhuǎn)換生產(chǎn)具體的目標代碼娩践。這個階段輸出的文件格式是 .s, 或者叫程序集活翩。(程序集概念這個時候不太明白)
clang也支持使用集成的匯編程序,其中代碼生成器會直接生成目標程序翻伺,這就會省掉生成.s文件或者目標程序集
Assembler(匯編):
? ? 這個階段運行目標匯編器者將編譯器輸出的文件(理解就是上一步生成的.s或者程序集)轉(zhuǎn)換為目標程序纱新。這個階段生成的文件后綴為.o或者是目標文件
Linker(鏈接):
? ? 這個階段運行目標鏈接器去合并多個目標程序成一個可執(zhí)行文件或者動態(tài)庫。這個階段輸出成為a.out穆趴,.dylib或者.so文件
一些參數(shù)含義可以在這里搜索到脸爱,應該是需要翻墻。
OPTIONS
?可選的階段(參數(shù)):
? ? -E ? 運行 預編譯階段
? ? -fsyntax-only 運行預編譯未妹、語法機洗和類型檢查
? ? -S 運行前面的階段以及生成和優(yōu)化目標代碼簿废,生成程序集文件
? ? -c 運行上述所有的階段,加上匯編器络它,生成目標.o文件
? ? 沒有選擇任何控制階段(參數(shù)): 如果沒有選擇任何參數(shù)選項族檬,執(zhí)行上述所有的階段,并且進行連接生成可執(zhí)行文件或者共享庫(動態(tài)共享庫化戳?)
? ? 語言和模式可選參數(shù):
? ? ?-x <language> 后續(xù)文件視為支持特定類型的標準語言 ??
? ? ?-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一樣(單獨列出來有點沒頭沒腦的子巾,為了方便還是妥協(xié)因素?)
? ? ? ? -ObjeC, -ObjeC++: ? 源文件是 ObjectC 和ObjectC++
? ? ? ? -trigraphs: 開啟三字符和雙字符(自行google了解)
? ? ? ? -ffreestanding: ?是否是標準庫不存在的的環(huán)境(設計到操作系統(tǒng)小压,有點深线梗,搞不明白)。
????????-fno-builtin: 禁止優(yōu)化內(nèi)建函數(shù)如 strlen()和malloc()怠益。
????????-fmath-errno: 調(diào)用標準數(shù)學函數(shù)需要檢測是否會發(fā)生錯誤
? ? ? ? -fpascal-strings: 支持pascal-style 格式字符串"\pfoo"
????????-fms-extensions:支持Microsoft 擴展(還是微軟牛 ?-_-)
????????-fmsc-version=: _MSC_VER微軟編譯器版本宏仪搔,默認是1300
? ? ? ? ?-fborland-extensions: 支持 borland(一家公司)的擴展
? ? ? ? -fwritable-strings: 支持字c符串可修改選項,具體可以看看這段代碼蜻牢,使用clang 編譯時候加上和不加上這個選項會有不同效果-_-!
? ? ? ? -flax-vector-conversions: 允許隱式向量轉(zhuǎn)換的松散規(guī)則檢查
? ? ? ? -fblocks: 是蘋果的blocks 被識別
? ? ? ? -fobjc-abi-version=version: 選擇Object-C ABI版本烤咧,可用的版本1(不穩(wěn)定ABI),2(穩(wěn)定的ABI 1)抢呆,3(穩(wěn)定的ABI 2)(ABI 可以知乎上搜搜答案煮嫌,有些回答的挺好)
? ? ? ? -fobjc-nonfragile-abi-version=<version>:默認選擇Object-C穩(wěn)定版本的ABI,這個僅會用于Object-C ABI
? ? ? ? -fobjc-nonfragile-abi, -fno-objc-nonfragile-abi: 可以使用Object-C 穩(wěn)定的ABI抱虐,在對應的平臺上是默認的ABI昌阿,-fno 與之相反。
內(nèi)容翻譯的時候才發(fā)現(xiàn)不懂的內(nèi)容太多恳邀,耗時在意料之外懦冰。?TargetSelectionOptions 下一篇繼續(xù)翻譯!