計算機基礎知識點(三)、動態庫與靜態庫

一、什么是庫?


庫文件其實是一個已經編譯完成的二進制代碼。

例如我們在編譯完成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、基本不怎么改動的代碼,我們想減少項目的編譯時間,我們可以把它打包成庫(項目優化)

溪浣雙鯉的技術摸爬滾打之路

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。