Objective-C開發中Clang的使用

來自我的個人博客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代碼,生成的可執行文件以及終端執行結果如下:
Clang編譯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目錄

相關資料

  1. Clang documentation
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章