共計(jì) 1060 個(gè)字符,預(yù)計(jì)需要花費(fèi) 3 分鐘才能閱讀完成。
這篇文章將為大家詳細(xì)講解有關(guān) linux 中動(dòng)態(tài)庫和靜態(tài)庫的區(qū)別有哪些,丸趣 TV 小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
區(qū)別:1、靜態(tài)庫在程序編譯時(shí)會(huì)被連接到目標(biāo)代碼中,程序運(yùn)行時(shí)將不再需要該靜態(tài)庫;動(dòng)態(tài)庫在程序編譯時(shí)并不會(huì)被連接到目標(biāo)代碼中,而是在程序運(yùn)行時(shí)才被載入,因此在程序運(yùn)行時(shí)還需要?jiǎng)討B(tài)庫存在。2、動(dòng)態(tài)庫產(chǎn)生的文件比較小,靜態(tài)庫產(chǎn)生的文件比較大。
本教程操作環(huán)境:CentOS 6 系統(tǒng)、Dell G3 電腦。
linux 中動(dòng)態(tài)庫和靜態(tài)庫的相同點(diǎn)和區(qū)別
相同點(diǎn):
無論靜態(tài)庫,還是動(dòng)態(tài)庫,都是由.o 文件創(chuàng)建的。因此,我們必須將源程序通過 gcc 先編譯成.o 文件;
區(qū)別:
1、代碼載入時(shí)間不同
靜態(tài)庫在程序編譯時(shí)會(huì)被連接到目標(biāo)代碼中,程序運(yùn)行時(shí)將不再需要該靜態(tài)庫;
動(dòng)態(tài)庫在程序編譯時(shí)并不會(huì)被連接到目標(biāo)代碼中,而是在程序運(yùn)行時(shí)才被載入,因此在程序運(yùn)行時(shí)還需要?jiǎng)討B(tài)庫存在
2、編譯規(guī)則不同
動(dòng)態(tài)庫編譯
動(dòng)態(tài)類庫的名字一般是 libxxx.so,動(dòng)態(tài)函數(shù)庫在編譯的時(shí)候 并沒有被編譯進(jìn)目標(biāo)代碼中,你的程序執(zhí)行到相關(guān)函數(shù)時(shí)才調(diào)用該函數(shù)庫里的相應(yīng)函數(shù),因此動(dòng)態(tài)函數(shù)庫所產(chǎn)生的可執(zhí)行文件比較小;
動(dòng)態(tài)庫編譯時(shí):最主要的是 GCC 命令行的一個(gè)選項(xiàng),-shared 該選項(xiàng)指定生成動(dòng)態(tài)連接庫,例如:
g++ -shared -o libd1.so d1.o /* 根據(jù)中間目標(biāo)文件 d1.o 創(chuàng)建動(dòng)態(tài)庫文件 d1.so*/
g++ -shared -o libd2.so d2.o /* 根據(jù)中間目標(biāo)文件 d2.o 創(chuàng)建動(dòng)態(tài)庫文件 d2.so*/
靜態(tài)庫編譯
類庫的名字一般是 libxxx.a;利用靜態(tài)函數(shù)庫編譯成的文件比較大,因?yàn)檎麄€(gè) 函數(shù)庫的所有數(shù)據(jù)都會(huì)被整合進(jìn)目標(biāo)代碼中,他的優(yōu)點(diǎn)就顯而易見了,即編譯后的執(zhí)行程序不需要外部的函數(shù)庫支持,因?yàn)樗惺褂玫暮瘮?shù)都已經(jīng)被編譯進(jìn)去了。當(dāng)然這也會(huì)成為他的缺點(diǎn),因?yàn)槿绻o態(tài)函數(shù)庫改變了,那么你的程序必須重新編譯。
UNIX 中,使用 ar 命令創(chuàng)建或者操作靜態(tài)庫
ar archivefile objfile
archivefile:archivefile 是靜態(tài)庫的名稱
objfile:objfile 是已.o 為擴(kuò)展名的中間目標(biāo)文件名,可以多個(gè)并列;
例如:
g++ -o hello.o -c hello.cpp
ar cqs libHello.a hello.o
關(guān)于“l(fā)inux 中動(dòng)態(tài)庫和靜態(tài)庫的區(qū)別有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請把它分享出去讓更多的人看到。