靜態(tài)庫和動(dòng)態(tài)庫的區(qū)別

庫是程序代碼的集合,是共享程序代碼的一種方式

1.

一種情況是某些代碼需要給別人使用,但是我們不希望別人看到源碼,就需要以庫的形式進(jìn)行封裝,只暴露出頭文件。

另外一種情況是,對(duì)于某些不會(huì)進(jìn)行大的改動(dòng)的代碼,我們想減少編譯的時(shí)間,就可以把它打包成庫,因?yàn)閹焓且呀?jīng)編譯好的二進(jìn)制了,編譯的時(shí)候只需要Link一下,不會(huì)浪費(fèi)編譯時(shí)間。

2.靜態(tài)庫:

靜態(tài)庫即靜態(tài)鏈接庫。鏈接時(shí)會(huì)被完整的復(fù)制到可執(zhí)行文件中,被多次使用就有多份拷貝,且這段代碼在目標(biāo)程序里不會(huì)再改變。

優(yōu)點(diǎn)

編譯完成之后,庫文件實(shí)際上就沒有作用了。目標(biāo)程序沒有外部依賴,直接就可以運(yùn)行。

缺點(diǎn)

會(huì)使用目標(biāo)程序的體積增大。

動(dòng)態(tài)庫:

動(dòng)態(tài)庫即動(dòng)態(tài)鏈接庫。與靜態(tài)庫相反,動(dòng)態(tài)庫在鏈接時(shí)不復(fù)制(目標(biāo)程序中只會(huì)存儲(chǔ)指向動(dòng)態(tài)庫的引用),程序運(yùn)行時(shí)由系統(tǒng)動(dòng)態(tài)加載到內(nèi)存,系統(tǒng)只加載一次,多個(gè)程序共用(如系統(tǒng)的UIKit.framework等),節(jié)省內(nèi)存。

優(yōu)點(diǎn)

不需要拷貝到目標(biāo)程序中,不會(huì)影響目標(biāo)程序的體積,而且同一份庫可以被多個(gè)程序使用(因?yàn)檫@個(gè)原因,動(dòng)態(tài)庫也被稱作共享庫)。

運(yùn)行時(shí)才載入的特性,也可以讓我們隨時(shí)對(duì)庫進(jìn)行替換,而不需要重新編譯代碼。

缺點(diǎn)

動(dòng)態(tài)載入會(huì)帶來一部分性能損失,使用動(dòng)態(tài)庫也會(huì)使得程序依賴于外部環(huán)境。如果環(huán)境缺少動(dòng)態(tài)庫或者庫的版本不正確,就會(huì)導(dǎo)致程序無法運(yùn)行(Linux 下喜聞樂見的 lib not found 錯(cuò)誤)。

.a和.framework的區(qū)別:

.a是純二進(jìn)制文件,.a文件不能單獨(dú)使用,至少要有.h文件配合

.framework除了二進(jìn)制文件外,還包含一些資源文件(頭文件,plist等),由于自身包含了頭文件,所以.framework可以單獨(dú)使用。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容