前言
做iOS的過程中會引用一些三方庫,而這些庫,有的是.a,有的是.framework,有的是.dylib,有的是.tbd,說實話,我還是比較暈的,做個筆記,方便記憶QAQ。
靜態庫和動態庫
靜態庫(.a)和動態庫(.dylib)都是編譯好的二進制文件,區別在于用法。
對于一個靜態庫而言,其實已經是編譯好的了,類似一個 .o 的集合。在 build 的過程中只會參與鏈接的過程,而這個鏈接的過程簡單的講就是合并,并且鏈接器只會將靜態庫中被使用的部分合并到可執行文件中去,在編譯鏈接的時候,會將靜態庫的所有文件都添加到目標 app 可執行文件中,并在程序運行之后,靜態庫與 app 可執行文件 一起被加載到同一塊代碼區中。
對于動態庫而言,其實分 動態鏈接庫 和 動態加載庫 兩種的,這兩個最本質的區別還是加載時間。
動態鏈接庫:在沒有被加載到內存的前提下,當可執行文件被加載,動態庫也隨著被加載到內存中。
動態加載庫:當需要的時候再使用 dlopen 等通過代碼或者命令的方式來加載。
但是不論是哪種動態庫,相比較與靜態庫,動態庫處理起來要棘手的多。由于動態庫是動態的,所以你事先不知道某個函數的具體地址。因此動態鏈接器在鏈接函數的時候需要做大量的工作。
不管是靜態庫、動態庫,兩者的區別和在內存哪個區域沒有關系,最本質的區別是,一個的函數調用在編譯的時候就已經確定,而動態庫是動態加載的。換句話說,靜態庫修改了東西,整個程序需要重新編譯,而對于動態庫的修改而言,只需要重啟 app(重置 PLT )
注:
Mac下,.a文件指靜態庫,.dylib指動態庫,.tbd其實是一個YAML文件,描述了需要鏈接的動態庫的信息。主要目的是為了減少app 的下載大小,在xcode7以后用來取代.dylib。為了更方便的使用動態庫和靜態庫(一般情況下,使用.a或者使用.tbd,都要配合資源文件和頭文件使用),所以我理解下來,『.framework = .a/.tbd + .h + bundle』
最后
其實關于Xcode怎么創建.framework,網上有很多教程,就不多說了,這篇文章都是參考了網上別人的說法,為了方便記憶和理解,才記錄下來的,其實說到動態庫和靜態庫的優缺點,說法很多,至于怎么選擇,還是看具體項目比較合適,目前我的認識還很淺,如果有更好的理解了,再來更新,mark!!!QAQ
拓展
說到.a文件,關于.a文件的多平臺支持,還是需要研究一下的,這里先記錄下了,armv7 ,i386, x86_64 ,arm64,還有動態庫實現app的熱修復(繼續學習,我猜想JSPatch的思路應該是這樣的)。