一、什么是庫?
庫文件其實是一個已經編譯完成的二進制代碼。
例如我們在編譯完成iOS工程的時候,會在工程目錄Products
下生成一個可執行的二進制文件,Show in Finder
直接拖到終端就可以運行。
庫在使用的時候需要link
,link
方式分為兩種:動態和靜態,所以庫我們一般分為靜態庫(.a/.lib)和動態庫(.dll/.so/.tbd/.dylib)。
除了以上幾種,Mac OS/iOS 平臺還可以使用 Framework
。
Framework 實際上是一種蘋果特有的打包方式,例如.a這種靜態庫就是一個純粹的二進制文件,而Framework則是將庫的二進制文件,頭文件和有關的資源文件打包到一起的產物,這樣方便管理和分發,而.a則還需要頭文件和資源文件的配合。大致理解成下面這種關系:
.a二進制文件 + .h頭文件 + resource資源文件 = Framework
需要注意的是:蘋果系統提供的framework是運行在系統中的,而開發者使用Cocoa Touch Framework
方式創建的framework則存放在app的bundle
目錄下,運行在沙盒里,也就是說:不同程序之間,不共享代碼。
二、動態庫與靜態庫的區別
靜態庫和動態庫的區別主要在于鏈接link
方式。
靜態庫:
靜態庫在編譯的時候會被直接拷貝一份,復制到目標程序(可執行文件)里,這段代碼在目標程序里就不會再改變了。
優點: 靜態庫的好處很明顯,編譯完成之后,庫文件實際上就沒有作用了。目標程序沒有外部依賴,直接就可以運行。
缺點: 會重復拷貝多份,導致目標應用程序體積增大;還有一個缺點就是多個靜態庫文件名以及靜態變量名不能重復,不然編譯會報錯或者找錯
動態庫:
不同于靜態庫,動態庫在編譯時并不會被拷貝到目標程序中,目標程序中只會存儲指向動態庫的引用。等到程序運行時,動態庫才會被真正加載進來。
優點:動態庫不需要拷貝到目標程序中,不會影響目標程序的體積,而且同一份庫可以被多個程序使用,由于動態庫是程序運行時才會載入的特性,可以讓我們隨時對庫進行替換,而不需要重新編譯代碼
缺點:運行時加載會損失一部分性能,而且依賴外部環境,環境配置不支持這個版本的動態庫會導致程序無法運行或者報錯
三、使用庫的場景:
庫本身的優勢:庫是已經編譯好的二進制了,編譯的時候只需要 Link 一下,不會浪費編譯時間。
使用庫的場景:
1、我們需要提供代碼給別人使用,但是不想讓別人看到我們的源碼,我們就可以只暴露頭文件,把代碼封裝在庫里面。
2、基本不怎么改動的代碼,我們想減少項目的編譯時間,我們可以把它打包成庫(項目優化)