描述:
clang-Clang C,C ++和Objective-C編譯器。
clang是一個(gè)C、c++和Objective-C編譯器,它包含預(yù)處理、解析、優(yōu)化、代碼生成、匯編和鏈接。根據(jù)傳遞的高級(jí)模式設(shè)置,Clang會(huì)在完成完整鏈接之前停止。盡管Clang是高度集成的,但重要的是了解編譯的階段,了解如何調(diào)用它。這些階段是:
驅(qū)動(dòng):
clang可執(zhí)行文件實(shí)際上是一個(gè)小型驅(qū)動(dòng)程序,它控制其他工具(如編譯器、匯編器和鏈接器)的整體執(zhí)行。通常您不需要與驅(qū)動(dòng)程序交互,但是您可以透明地使用它來運(yùn)行其他工具。
預(yù)處理:
此階段處理輸入源文件的標(biāo)記化,宏擴(kuò)展,#include擴(kuò)展以及其他預(yù)處理程序指令的處理。該階段的輸出通常稱為“ .i”(對(duì)于C),“.ii”(對(duì)于C ++),“.mi”(對(duì)于Objective-C)或“ .mii”(對(duì)于Objective-C ++)文件 。
解析和語義分析:
此階段解析輸入文件,將預(yù)處理器令牌轉(zhuǎn)換為解析樹。一旦采用了語法分析樹的形式,它就會(huì)應(yīng)用語義分析來計(jì)算表達(dá)式的類型,并確定代碼是否格式正確。該階段負(fù)責(zé)生成大多數(shù)編譯器警告以及解析錯(cuò)誤。該階段的輸出是“抽象語法樹”(AST)。
代碼生成和優(yōu)化:
此階段將AST轉(zhuǎn)換為低級(jí)中間代碼(稱為“ LLVM IR”),最終轉(zhuǎn)換為機(jī)器代碼。此階段負(fù)責(zé)優(yōu)化生成的代碼并處理特定于目標(biāo)的代碼生成。該階段的輸出通常稱為“ .s”文件或“ assembly”文件。
Clang還支持使用集成匯編器,在該匯編器中,代碼生成器直接生成目標(biāo)文件。這避免了生成“ .s”文件和調(diào)用目標(biāo)匯編程序的開銷。
匯編程序:
此階段運(yùn)行目標(biāo)匯編程序,以將編譯器的輸出轉(zhuǎn)換為目標(biāo)目標(biāo)文件。該階段的輸出通常稱為“ .o”文件或“ object”文件。
鏈接器:
此階段運(yùn)行目標(biāo)鏈接程序,以將多個(gè)目標(biāo)文件合并到可執(zhí)行文件或動(dòng)態(tài)庫(kù)中。此階段的輸出通常稱為“ a.out”,“。dylib”或“ .so”文件。
clang靜態(tài)分析器:
Clang靜態(tài)分析器是一種工具,可掃描源代碼以嘗試通過代碼分析來發(fā)現(xiàn)錯(cuò)誤。該工具使用了Clang的許多部分,并內(nèi)置在同一驅(qū)動(dòng)程序中。有關(guān)如何使用靜態(tài)分析器的更多詳細(xì)信息,請(qǐng)參見<https://clang-analyzer.llvm.org>。
選項(xiàng):
階段選擇選項(xiàng):
-E
運(yùn)行預(yù)處理器階段。
-fsyntax-only
運(yùn)行預(yù)處理器、解析器和類型檢查階段。
-S
運(yùn)行前面的階段以及LLVM生成和優(yōu)化階段以及特定于目標(biāo)的代碼生成,從而生成一個(gè)程序集文件。
-c
運(yùn)行上述所有程序,再加上匯編程序,生成一個(gè)目標(biāo)”.o”對(duì)象文件。
無階段選擇選項(xiàng):
如果沒有指定階段選擇選項(xiàng),則運(yùn)行上述所有階段,并運(yùn)行鏈接器將結(jié)果合并到可執(zhí)行庫(kù)或共享庫(kù)中。
語言選擇和模式選項(xiàng):
-x <language>
將后續(xù)的輸入文件視為具有類型語言。
-std=<standard>
指定要編譯的語言標(biāo)準(zhǔn)。
C語言支持的值有:c89, c90,iso9899:1990…
-stdlib=<library>
指定要使用的c++標(biāo)準(zhǔn)庫(kù);支持的選項(xiàng)是libstdc++和libc++。如果未指定,將使用平臺(tái)默認(rèn)值。
-rtlib=<library>
指定要使用的編譯器運(yùn)行時(shí)庫(kù);支持的選項(xiàng)是libgcc和compiler-rt。如果未指定,將使用平臺(tái)默認(rèn)值。
-ansi
與-std = c89相同。
-ObjC,-ObjC++
將源輸入文件分別視為Objective-C和object - c++輸入。
-trigraghs
啟用trigraghs
-ffreestanding
指示該文件應(yīng)針對(duì)獨(dú)立環(huán)境而非托管環(huán)境進(jìn)行編譯。
-fno-builtin
禁用strlen()和malloc()等內(nèi)置函數(shù)的特殊處理和優(yōu)化。
-fmath-errno
指出應(yīng)該將數(shù)學(xué)函數(shù)視為更新errno。
-fpascal-strings
使用" \pfoo"啟用pascal風(fēng)格的字符串支持。
-fms-extensions
啟用對(duì)Microsoft擴(kuò)展的支持。
-fmsc-version=
設(shè)置_MSC_VER。在Windows上默認(rèn)為1300。否則不設(shè)置。
-fborland-extensions
啟用對(duì)Borland擴(kuò)展的支持。
-fwritable-strings
將所有字符串文字默認(rèn)設(shè)置為可寫。這將禁用字符串唯一化和其他優(yōu)化。
-flax-vector-conversions
允許使用松散的類型檢查規(guī)則進(jìn)行隱式矢量轉(zhuǎn)換。
-fblocks
啟用“阻止”語言功能。
-fobjc-abi-version=version
選擇要使用的Objective-CABI版本??捎冒姹緸?(舊式“脆弱” ABI),2(非脆弱ABI 1)和3(非脆弱ABI 2)。
-fobjc-nonfragile-abi-version=<version>
選擇默認(rèn)使用的Objective-C非脆弱ABI版本。只有當(dāng)非脆弱ABI被啟用時(shí),這個(gè)才會(huì)被用作Objective-C ABI(通過-fobjc-nonfragile-abi,或者因?yàn)樗瞧脚_(tái)默認(rèn)值)。? ? ? ?
-fobjc-nonfragile-abi,-fno-obj-nonfragile-abi
啟用Objective-C非脆弱ABI。在默認(rèn)ABI的平臺(tái)上,可以用-fno-objc-nonfragile-abi禁用它。
目標(biāo)選擇選項(xiàng):
Clang完全支持交叉編譯作為其設(shè)計(jì)的固有部分。根據(jù)您的Clang版本的配置方式,它可能支持許多交叉編譯器,或者僅支持本機(jī)目標(biāo)。?
-target <architecture>
指定要為其構(gòu)建的體系結(jié)構(gòu)。
--print-supported-cpus
打印出給定目標(biāo)支持的處理器列表(通過-target =<architecture>或-arch<architecture>指定)。如果沒有指定目標(biāo),將使用系統(tǒng)默認(rèn)目標(biāo)。
-mcpu=?,-mtune=?
–print-supported-cpus的別名
-march=<cpu>
指定Clang應(yīng)該為特定處理器家族成員和更高版本生成代碼。例如,如果指定-march = i486,則允許編譯器生成在i486和更高版本的處理器上有效的指令,但在較早版本的處理器上可能不存在。
代碼生成選項(xiàng):
-O0, -O1, -O2, -O3, -Ofast,-Os, -Oz, -Og, -O, -O4
指定使用哪個(gè)優(yōu)化級(jí)別:
-O0
意味著“無優(yōu)化”:這個(gè)級(jí)別編譯速度最快,生成的調(diào)試代碼最多。
-O1
在-O0和-O2之間。
-O2
中等水平的優(yōu)化,支持大多數(shù)優(yōu)化。
-O3
與-O2相似,不同之處在于它可以使優(yōu)化執(zhí)行的時(shí)間更長(zhǎng)或可能生成更大的代碼(以使程序運(yùn)行更快)。
-Ofast
啟用-O3中的所有優(yōu)化以及可能違反嚴(yán)格遵守語言標(biāo)準(zhǔn)的其他激進(jìn)優(yōu)化。
-Os
比如-O2,通過額外的優(yōu)化來減少代碼大小。
-Oz
比如-Os(也就是-O2),但是進(jìn)一步減少了代碼大小。
-Og
像-O1。在將來的版本中,此選項(xiàng)可能會(huì)禁用不同的優(yōu)化,以提高可調(diào)試性。
-O
相當(dāng)于- O2。
-O4 and higher
目前相當(dāng)于-O3
-g,-gilne-tables-only,-gmodules
控制調(diào)試信息輸出。注意,Clang調(diào)試信息在-O0下工作得最好。當(dāng)指定多個(gè)以-g開頭的選項(xiàng)時(shí),最后一個(gè)將生效:
-g
生成調(diào)試信息
-gline-tables-only
只生成行表調(diào)試信息。這允許使用內(nèi)聯(lián)信息進(jìn)行符號(hào)化回溯,但不包括關(guān)于變量、變量位置或類型的任何信息。
-gmodules
生成包含對(duì)Clang模塊或預(yù)編譯頭中定義的類型的外部引用的調(diào)試信息,而不是將冗余的調(diào)試類型信息發(fā)送到每個(gè)目標(biāo)文件中。此選項(xiàng)透明地將Clang模塊格式切換為將Clang模塊與調(diào)試信息一起保存的目標(biāo)文件容器。當(dāng)編譯使用Clang模塊或預(yù)編譯頭文件的程序時(shí),此選項(xiàng)將生成具有更快的編譯時(shí)間和更小的目標(biāo)文件的完整調(diào)試信息。在構(gòu)建靜態(tài)庫(kù)以分發(fā)給其他計(jì)算機(jī)時(shí),不應(yīng)使用此選項(xiàng),因?yàn)檎{(diào)試信息將包含引用將庫(kù)中的目標(biāo)文件建立在機(jī)器上的模塊高速緩存中。
-fstandalone-debug-fno-standalone-debug
Clang支持許多優(yōu)化以減少二進(jìn)制文件中調(diào)試信息的大小。它們的工作原理是,調(diào)試類型信息可以分布在多個(gè)編譯單元上。例如,Clang不會(huì)為模塊不需要的類型發(fā)出類型定義,而可以用前置聲明代替。此外,Clang將僅在包含該類的vtable的模塊中為動(dòng)態(tài)C ++類發(fā)出類型信息。
-fstandalone-debug選項(xiàng)關(guān)閉這些優(yōu)化。當(dāng)使用不帶調(diào)試信息的第三方庫(kù)時(shí),這很有用。這是Darwin的默認(rèn)設(shè)置。請(qǐng)注意,對(duì)于程序完全未引用的類型,Clang永遠(yuǎn)不會(huì)發(fā)出類型信息。
-fexceptions
啟用展開信息的生成。這允許通過Clang編譯堆棧幀引發(fā)異常。在x86-64中默認(rèn)情況下處于啟用狀態(tài)。
-ftrapv
生成代碼以捕獲整數(shù)溢出錯(cuò)誤。C中未定義有符號(hào)整數(shù)溢出。使用此標(biāo)志,將生成額外的代碼來檢測(cè)此情況并在發(fā)生時(shí)中止。
-fvisibility
此標(biāo)志設(shè)置默認(rèn)可見性級(jí)別。
-fcommon,-fno-common
此標(biāo)志指定沒有初始化式的變量具有公共鏈接。它可以用-fno-common禁用。
-ftls-model=<model>
設(shè)置用于線程局部變量的默認(rèn)線程局部存儲(chǔ)(TLS)模型。有效值為:" global-dynamic ", " local-dynamic ", "initial-exec "和" local-exec "。默認(rèn)是“global-dynamic”??梢允褂胻ls_model屬性重寫默認(rèn)模型。如果可能的話,編譯器將嘗試選擇一個(gè)更有效的模型。
-flto,-flto=full,-flto=thin,-emit-llvm
生成LLVM格式的輸出文件,適用于鏈接時(shí)間優(yōu)化。與-S一起使用時(shí),將生成LLVM中間語言匯編文件,否則將生成LLVM位代碼格式的目標(biāo)文件(取決于階段選擇選項(xiàng),可以將其傳遞給鏈接器)。
-flto的默認(rèn)值為“ full”,其中LLVM位代碼適用于整體式鏈接時(shí)間優(yōu)化(LTO),其中鏈接程序?qū)⑺写祟惸K合并為單個(gè)組合模塊以進(jìn)行優(yōu)化。如果使用“ thin”,則會(huì)調(diào)用ThinLTO編譯。
驅(qū)動(dòng)程序選項(xiàng):
-###
打印(但不要運(yùn)行)要為此編譯運(yùn)行的命令。
--help
顯示可用的選項(xiàng)。
--Qunused-arguments
不要為未使用的驅(qū)動(dòng)程序參數(shù)發(fā)出任何警告。
-Wa,<args>
將args中以逗號(hào)分隔的參數(shù)傳遞給匯編程序。
-Wl,<args>
將args中以逗號(hào)分隔的參數(shù)傳遞給鏈接器。
-Wp,<args>
將args中逗號(hào)分隔的參數(shù)傳遞給預(yù)處理器。
-Xanalyzer <arg>
將arg傳遞給靜態(tài)分析器。
-Xassembler <arg>
將arg傳遞給匯編程序。
-Xlinker <arg>
將參數(shù)傳遞給鏈接器。
-Xpreprocessor <arg>
將參數(shù)傳遞給預(yù)處理器。
-o <file>
將輸出寫入文件
-print-file-name=<file>
打印文件的完整庫(kù)路徑。
-print-libgcc-file-name
打印當(dāng)前使用的編譯器運(yùn)行時(shí)庫(kù)的庫(kù)路徑(“ libgcc.a”或“ libclang_rt.builtins.*.a”)。
-print-prog-name=<name>
打印名稱的完整程序路徑。
-print-search-dirs
打印用于查找?guī)旌统绦虻穆窂健?/p>
-save-temps
保存中間編譯結(jié)果。
-save-stats,-save-stats=cwd,-save-stats=obj
將內(nèi)部代碼生成(LLVM)統(tǒng)計(jì)數(shù)據(jù)保存到當(dāng)前目錄(-save-stats/ " -save-stats=cwd ")或輸出文件目錄(" -save-state=obj ")中的一個(gè)文件中。
-integrated-as,-no-integrated-as
分別用于啟用和禁用集成匯編程序的使用。默認(rèn)情況下,集成匯編程序是否打開取決于目標(biāo)。
-time
為單個(gè)命令計(jì)時(shí)。
-ftime-report
打印每個(gè)編譯階段的時(shí)序摘要
-v
顯示運(yùn)行和使用詳細(xì)輸出的命令。
診斷選項(xiàng):
-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
這些選項(xiàng)控制Clang如何打印診斷信息(錯(cuò)誤和警告)。有關(guān)更多信息,請(qǐng)參閱Clang用戶手冊(cè)。
預(yù)處理選項(xiàng):
-D<macroname>=<value>
將一個(gè)隱式#define添加到預(yù)定義緩沖區(qū)中,該緩沖區(qū)在對(duì)源文件進(jìn)行預(yù)處理之前會(huì)被讀取。
-U<macroname>
將一個(gè)隱式#undef添加到預(yù)定義緩沖區(qū)中,該緩沖區(qū)在對(duì)源文件進(jìn)行預(yù)處理之前會(huì)被讀取。
-include <filename>
將一個(gè)隱式#include添加到預(yù)定義緩沖區(qū)中,該緩沖區(qū)在對(duì)源文件進(jìn)行預(yù)處理之前已被讀取。
-I<directory>
將指定目錄添加到包含文件的搜索路徑。
-F<directory>
將指定的目錄添加到框架包含文件的搜索路徑中。
-nostdinc
不要在標(biāo)準(zhǔn)系統(tǒng)目錄或編譯器內(nèi)置目錄中搜索包含文件。
-nostdlibinc
不要在標(biāo)準(zhǔn)系統(tǒng)目錄中搜索包含文件,而要搜索編譯器內(nèi)置的包含目錄。
-nobuiltininc
不要在clang的內(nèi)置目錄中搜索包含文件。