- 查看編譯源文件需要的幾個(gè)不同的階段:
clang -ccc-print-phases main.m
- 查看oc的c實(shí)現(xiàn):
clang -rewrite-objc main.m
- 查看操作內(nèi)部命令:
clang -### main.m -o main
- 想看清clang的全部過程,可以先通過-E查看clang在預(yù)處理處理這步做了什么:(這個(gè)過程的處理包括宏的替換,頭文件的導(dǎo)入,以及類似#if的處理)
clang -E main.m
- 預(yù)處理完成后就會(huì)進(jìn)行詞法分析,這里會(huì)把代碼切成一個(gè)個(gè) Token,比如大小括號(hào),等于號(hào)還有字符串等:
clang -fmodules -fsyntax-only -Xclang -dump-tokens main.m
- 然后是語法分析,驗(yàn)證語法是否正確,然后將所有節(jié)點(diǎn)組成抽象語法樹 AST:
clang -fmodules -fsyntax-only -Xclang -ast-dump main.m
- 完成這些步驟后就可以開始IR中間代碼的生成了,CodeGen 會(huì)負(fù)責(zé)將語法樹自頂向下遍歷逐步翻譯成 LLVM IR,IR 是編譯過程的前端的輸出后端的輸入:
clang -S -fobjc-arc -emit-llvm main.m -o main.ll
- 這里 LLVM 會(huì)去做些優(yōu)化工作,在 Xcode 的編譯設(shè)置里也可以設(shè)置優(yōu)化級(jí)別-01,-03,-0s,還可以寫些自己的 Pass:
clang -O3 -S -fobjc-arc -emit-llvm main.m -o main.ll
- 生成匯編
clang -S -fobjc-arc main.m -o main.s
- 生成目標(biāo)文件
clang -fmodules -c main.m -o main.o
- 生成可執(zhí)行文件
clang main.o -o main
- 執(zhí)行
./main
下面是完整步驟:
1. 編譯信息寫入輔助文件,創(chuàng)建文件架構(gòu) .app 文件
2. 處理文件打包信息
3. 執(zhí)行 CocoaPod 編譯前腳本,checkPods Manifest.lock
4. 編譯.m文件,使用 CompileC 和 clang 命令
5. 鏈接需要的 Framework
6. 編譯 xib
7. 拷貝 xib ,資源文件
8. 編譯 ImageAssets
9. 處理 info.plist
10. 執(zhí)行 CocoaPod 腳本
11. 拷貝標(biāo)準(zhǔn)庫
12. 創(chuàng)建 .app 文件和簽名