來自我的個人博客Minecode.link
在使用Objective-C開發過程中,尤其在瞭解某些功能的底層實現時,常用到Clang編譯器的命令。在此對常用命令做個簡單總結。
Clang的簡介
Clang是一個C、C++、Objective-C和Objective-C++編程語言的編譯器前端,其後端爲底層虛擬機(LLVM)。是一個GCC的替代品,也是Xcode的首選編譯器。
通過Clang,我們可以做什麼?
- 編譯OC代碼,這也是它的本職工作。
- 可以將OC代碼轉化至C++或彙編代碼,從而窺探OC某些特性的底層實現。
- 在終端快速編譯,佔用較少內存,同時具有診斷功能。
編譯OC代碼
除了使用Xcode編譯工程,我們也可以通過Clang來手動編譯。
在Xcode中開發項目時,我們知道,Project->Targets->Build Phases->Compile Sources
中對應的文件標記就是指定該文件爲ARC/Non-ARC(MRC)。其中ARC對應-fobjc-arc
,MRC對應-fno-objc-arc
。而剛纔說到Clang實際就是LLVM的前端,所以我們在clang中使用同樣指令指定編譯方式。如下指令:
ARC下編譯指令
clang -fobjc-arc -framework Foundation main.m -o main
MRC下編譯指令
clang -fno-objc-arc -framework Foundation main.m -o main
- -framwork [框架名] 對應所使用的框架
- -o [文件名] 爲輸出的可執行文件名
我們在.m文件中輸出 “Hello,World”
int main(int argc, const char * argv[]) {
NSLog(@"Hello, World!");
return 0;
}
編譯OC代碼,生成的可執行文件以及終端執行結果如下:
轉換爲C++代碼
OC底層實現爲C,所以要研究其屬性、消息機制、Runtime等特性,就要用到Clang的代碼轉化。
將OC的.m文件轉化爲C++源代碼
clang -rewrite-objc main.m
生成的cpp即爲OC的底層實現,接下來就是研究其底層實現的工作了。
轉換爲彙編代碼
高級語言最終是要轉化爲彙編然後轉化爲01串的,Clang爲我們提供了轉化爲彙編的功能。
將OC的.m文件轉化爲彙編源代碼
clang -S main.m
生成的.s即爲對應的彙編實現。
其他指令
由於其他指令並不常見,不再贅述,列舉部分以供查閱。
指令 | 說明 |
---|---|
-E | 預編譯代碼(即處理宏定義) |
-C | 僅編譯但不鏈接(生成.o鏈接文件) |
-S | 僅編譯不彙編(生成.s彙編代碼文件) |
-o 文件名 | 鏈接,輸出可執行文件 |
-g | 在可執行程序中包含標準調試信息 |
-I 路徑 | 在頭文件的搜索路徑列表中添加dir目錄 |
-L 路徑 | 在庫文件的搜索路徑列表中添加dir目錄 |