一、編譯過程

編譯過程.jpg
1、預(yù)編譯(Preprocessing)
???????預(yù)編譯即預(yù)處理,編譯器不能直接對預(yù)編譯命令進(jìn)行編譯,必須在對程序進(jìn)行編譯之前,先對程序中這些特殊的命令進(jìn)行處理。預(yù)編譯主要處理以“#”開始的編譯命令,如宏定義,條件編譯,文件包含,去注釋等。
$ clang -E main.m
2、編譯(Compilation)
???????將預(yù)編譯處理完后的代碼編譯成匯編代碼。此階段還進(jìn)行了詞法、語法分析、生成LLVM IR中間代碼、bitcode優(yōu)化,最后生成匯編代碼
$ clang -S -fobjc-arc main.m -o main.s
3、匯編(Assemble)
???????把.s的匯編文件轉(zhuǎn)成可執(zhí)行的二進(jìn)制文件。
4、鏈接(Linking)
???????將匯編生成的目標(biāo)文件與所有的引用的庫一起鏈接打包到可執(zhí)?文件當(dāng)中。此階段只鏈接靜態(tài)庫,如 .a .lib 等
二、靜態(tài)庫
???????靜態(tài)庫是經(jīng)過編譯的二進(jìn)制文件。在鏈接階段,引用庫一旦鏈接成功,將匯編生成的目標(biāo)文件與引用的庫一起鏈接打包到可執(zhí)?文件當(dāng)中。
優(yōu)點
1、代碼裝載速度快,執(zhí)行速度略比動態(tài)鏈接庫快;
2、編譯進(jìn)二進(jìn)制文件當(dāng)中,相對安全。
缺點
1、代碼冗余度高;
2、APP容量增大。
三、動態(tài)庫
???????程序編譯階段并不會鏈接到目標(biāo)二進(jìn)制文件當(dāng)中,?是在程序運行時才被載?。
優(yōu)點
1、減少打包之后的APP的容量;
2、共享內(nèi)存,節(jié)約資源;
3、通過更新動態(tài)庫,實現(xiàn)熱更新;
4、冗余少,低耦合。
缺點
1、不穩(wěn)定,不安全