庫(Library)說白了就是一段編譯好的二進(jìn)制代碼躏鱼,加上頭文件就可以供別人使用。
什么時候我們會用到庫呢?一種情況是某些代碼需要給別人使用蘑险,但是我們不希望別人看到源碼,就需要以庫的形式進(jìn)行封裝岳悟,只暴露出頭文件佃迄。另外一種情況是,對于某些不會進(jìn)行大的改動的代碼贵少,我們想減少編譯的時間呵俏,就可以把它打包成庫,因為庫是已經(jīng)編譯好的二進(jìn)制了滔灶,編譯的時候只需要 Link 一下普碎,不會浪費(fèi)編譯時間。
庫在使用的時候需要 Link录平,Link 的方式有兩種麻车,靜態(tài)和動態(tài)缀皱,于是便產(chǎn)生了靜態(tài)庫和動態(tài)庫。
靜態(tài)庫即靜態(tài)鏈接庫(Windows 下的 .lib动猬,Linux 和 Mac 下的 .a)啤斗。之所以叫做靜態(tài),是因為靜態(tài)庫在編譯的時候會被直接拷貝一份赁咙,復(fù)制到目標(biāo)程序里钮莲,這段代碼在目標(biāo)程序里就不會再改變了。
靜態(tài)庫的好處很明顯序目,編譯完成之后臂痕,庫文件實際上就沒有作用了。目標(biāo)程序沒有外部依賴猿涨,直接就可以運(yùn)行握童。當(dāng)然其缺點(diǎn)也很明顯,就是會使用目標(biāo)程序的體積增大叛赚。
動態(tài)庫即動態(tài)鏈接庫(Windows 下的 .dll澡绩,Linux 下的 .so,Mac 下的 .dylib/.tbd)俺附。與靜態(tài)庫相反肥卡,動態(tài)庫在編譯時并不會被拷貝到目標(biāo)程序中,目標(biāo)程序中只會存儲指向動態(tài)庫的引用事镣。等到程序運(yùn)行時步鉴,動態(tài)庫才會被真正加載進(jìn)來。
動態(tài)庫的優(yōu)點(diǎn)是璃哟,不需要拷貝到目標(biāo)程序中氛琢,不會影響目標(biāo)程序的體積,而且同一份庫可以被多個程序使用(因為這個原因随闪,動態(tài)庫也被稱作共享庫)阳似。同時,編譯時才載入的特性铐伴,也可以讓我們隨時對庫進(jìn)行替換撮奏,而不需要重新編譯代碼。動態(tài)庫帶來的問題主要是当宴,動態(tài)載入會帶來一部分性能損失畜吊,使用動態(tài)庫也會使得程序依賴于外部環(huán)境。如果環(huán)境缺少動態(tài)庫或者庫的版本不正確户矢,就會導(dǎo)致程序無法運(yùn)行(Linux 下喜聞樂見的 lib not found 錯誤)玲献。