溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C語(yǔ)言之靜態(tài)鏈接庫(kù)和動(dòng)態(tài)鏈接庫(kù)

發(fā)布時(shí)間:2020-07-14 07:54:06 來源:網(wǎng)絡(luò) 閱讀:761 作者:菜鳥養(yǎng)成記 欄目:編程語(yǔ)言

1:靜態(tài)鏈接庫(kù)

   比較早出現(xiàn)的是靜態(tài)鏈接庫(kù)。靜態(tài)庫(kù)其實(shí)就是商業(yè)公司將自己的函數(shù)庫(kù)源代碼經(jīng)過只編譯不連接形成.o的目標(biāo)文件,然后用ar工具將.o文件歸檔成.a的歸檔文件(.a的歸檔文件又叫靜態(tài)鏈接庫(kù)文件)。商業(yè)公司通過發(fā)布.a庫(kù)文件和.h頭文件來提供靜態(tài)庫(kù)給客戶使用;客戶拿到.a和.h文件后,通過.h頭文件得知庫(kù)中的庫(kù)函數(shù)的原型,然后在自己的.c文件中直接調(diào)用這些庫(kù)文件,在連接的時(shí)候鏈接器會(huì)去.a文件中拿出被調(diào)用的那個(gè)函數(shù)的編譯后的.o二進(jìn)制代碼段鏈接進(jìn)去形成最終的可執(zhí)行程序。


2:動(dòng)態(tài)鏈接庫(kù)

  動(dòng)態(tài)鏈接庫(kù)比靜態(tài)鏈接庫(kù)出現(xiàn)的晚一些,效率更高一些,是改進(jìn)型的?,F(xiàn)在我們一般都是使用動(dòng)態(tài)庫(kù)。靜態(tài)庫(kù)在用戶鏈接自己的可執(zhí)行程序時(shí)就已經(jīng)把調(diào)用的庫(kù)中的函數(shù)的代碼段鏈接進(jìn)最終可執(zhí)行程序中了,這樣好處是可以執(zhí)行,壞處是太占地方了。尤其是有多個(gè)應(yīng)用程序都使用了這個(gè)庫(kù)函數(shù)時(shí),實(shí)際上在多個(gè)應(yīng)用程序最后生成的可執(zhí)行程序中都各自有一份這個(gè)庫(kù)函數(shù)的代碼段。當(dāng)這些應(yīng)用程序同時(shí)在內(nèi)存中運(yùn)行時(shí),實(shí)際上在內(nèi)存中有多個(gè)這個(gè)庫(kù)函數(shù)的代碼段,這完全重復(fù)了。而動(dòng)態(tài)鏈接庫(kù)本身不將庫(kù)函數(shù)的代碼段鏈接入可執(zhí)行程序,只是做個(gè)標(biāo)記。然后當(dāng)應(yīng)用程序在內(nèi)存中執(zhí)行時(shí),運(yùn)行時(shí)環(huán)境發(fā)現(xiàn)它調(diào)用了一個(gè)動(dòng)態(tài)庫(kù)中的庫(kù)函數(shù)時(shí),會(huì)去加載這個(gè)動(dòng)態(tài)庫(kù)到內(nèi)存中,然后以后不管有多少個(gè)應(yīng)用程序去調(diào)用這個(gè)庫(kù)中的函數(shù)都會(huì)跳轉(zhuǎn)到第一次加載的地方去執(zhí)行(不會(huì)重復(fù)加載)


3:靜態(tài)鏈接庫(kù)和動(dòng)態(tài)鏈接庫(kù)的比較

  靜態(tài)庫(kù)是用戶在鏈接字節(jié)的可執(zhí)行程序時(shí)已經(jīng)將調(diào)用到的庫(kù)函數(shù)的代碼段鏈接到最終的可執(zhí)行程序中,這樣的好處是這樣的可執(zhí)行文件放到任何地方都能執(zhí)行,壞處是庫(kù)函數(shù)很占地方,使得鏈接得到的最終的可執(zhí)行程序變得很大。

使用動(dòng)態(tài)庫(kù)的時(shí)候,函數(shù)本身編譯鏈接到得到可執(zhí)行程序的時(shí)候,并不會(huì)講庫(kù)函數(shù)鏈接到可執(zhí)行程序中去,而是標(biāo)記這個(gè)函數(shù)用到哪些庫(kù)函數(shù),當(dāng)這個(gè)可執(zhí)行程序運(yùn)行時(shí),操作系統(tǒng)會(huì)自動(dòng)加載這些庫(kù)到內(nèi)存中。

比較:

通過上面的分析可以知道,靜態(tài)庫(kù)是將庫(kù)函數(shù)鏈接到最終的可執(zhí)行程序中,而動(dòng)態(tài)庫(kù)是沒有將庫(kù)函數(shù)鏈接到可執(zhí)行程序中。從單個(gè)可執(zhí)行程序的角度出發(fā)可執(zhí)行程序在內(nèi)存中運(yùn)行時(shí),系統(tǒng)還是會(huì)將庫(kù)函數(shù)加載到內(nèi)存中,這樣從內(nèi)存角度上講,兩個(gè)可執(zhí)行程序最終在內(nèi)存中運(yùn)行時(shí)所占的空間還是一樣的。但是從多個(gè)程序出發(fā),就不一樣了,比如a程序和b程序都用到了printf函數(shù),使用靜態(tài)庫(kù)時(shí),這兩個(gè)可執(zhí)行程序都包含了printf函數(shù),所以這時(shí)候內(nèi)存中就包含了兩份printf函數(shù);而使用動(dòng)態(tài)庫(kù)的時(shí)候,系統(tǒng)只會(huì)加載一份printf函數(shù),當(dāng)其他函數(shù)也要用到printf函數(shù)時(shí),只要到加載的printf函數(shù)的地址中調(diào)用即可,不需要再次加載,所以當(dāng)多個(gè)程序運(yùn)行時(shí),靜態(tài)庫(kù)就明顯比動(dòng)態(tài)庫(kù)更占內(nèi)存。


4:函數(shù)庫(kù)中庫(kù)函數(shù)的使用

(1)gcc中編譯鏈接程序默認(rèn)是使用動(dòng)態(tài)庫(kù)的,要想靜態(tài)鏈接需要顯式用-static來強(qiáng)制靜態(tài)鏈接。

(2)庫(kù)函數(shù)的使用需要注意3點(diǎn):第一,包含相應(yīng)的頭文件;第二,調(diào)用庫(kù)函數(shù)時(shí)注意函數(shù)原型;第三,有些庫(kù)函數(shù)鏈接時(shí)需要額外用-lxxx來指定鏈接;第四,如果是動(dòng)態(tài)庫(kù),要注意-L指定動(dòng)態(tài)庫(kù)的地址。





向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI