區(qū)別:1、靜態(tài)庫(kù)在程序編譯時(shí)會(huì)被連接到目標(biāo)代碼中,程序運(yùn)行時(shí)將不再需要該靜態(tài)庫(kù);動(dòng)態(tài)庫(kù)在程序編譯時(shí)并不會(huì)被連接到目標(biāo)代碼中,而是在程序運(yùn)行時(shí)才被載入,因此在程序運(yùn)行時(shí)還需要?jiǎng)討B(tài)庫(kù)存在。2、動(dòng)態(tài)庫(kù)產(chǎn)生的文件比較小,靜態(tài)庫(kù)產(chǎn)生的文件比較大。
本教程操作環(huán)境:centos 6系統(tǒng)、Dell G3電腦。
linux中動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)的相同點(diǎn)和區(qū)別
相同點(diǎn):
無(wú)論靜態(tài)庫(kù),還是動(dòng)態(tài)庫(kù),都是由.o文件創(chuàng)建的。因此,我們必須將源程序通過(guò)gcc先編譯成.o文件;
區(qū)別:
1、代碼載入時(shí)間不同
- 靜態(tài)庫(kù)在程序編譯時(shí)會(huì)被連接到目標(biāo)代碼中,程序運(yùn)行時(shí)將不再需要該靜態(tài)庫(kù);
- 動(dòng)態(tài)庫(kù)在程序編譯時(shí)并不會(huì)被連接到目標(biāo)代碼中,而是在程序運(yùn)行時(shí)才被載入,因此在程序運(yùn)行時(shí)還需要?jiǎng)討B(tài)庫(kù)存在
2、編譯規(guī)則不同
- 動(dòng)態(tài)庫(kù)編譯
動(dòng)態(tài)類庫(kù)的名字一般是libxxx.so,動(dòng)態(tài)函數(shù)庫(kù)在編譯的時(shí)候 并沒有被編譯進(jìn)目標(biāo)代碼中,你的程序執(zhí)行到相關(guān)函數(shù)時(shí)才調(diào)用該函數(shù)庫(kù)里的相應(yīng)函數(shù),因此動(dòng)態(tài)函數(shù)庫(kù)所產(chǎn)生的可執(zhí)行文件比較小;
動(dòng)態(tài)庫(kù)編譯時(shí):最主要的是GCC命令行的一個(gè)選項(xiàng), -shared 該選項(xiàng)指定生成動(dòng)態(tài)連接庫(kù), 例如:
g++ -shared -o libd1.so d1.o? ??/*根據(jù)中間目標(biāo)文件d1.o創(chuàng)建動(dòng)態(tài)庫(kù)文件d1.so*/
g++ -shared -o libd2.so d2.o? ??/*根據(jù)中間目標(biāo)文件d2.o創(chuàng)建動(dòng)態(tài)庫(kù)文件d2.so*/
- 靜態(tài)庫(kù)編譯
類庫(kù)的名字一般是libxxx.a;利用靜態(tài)函數(shù)庫(kù)編譯成的文件比較大,因?yàn)檎麄€(gè) 函數(shù)庫(kù)的所有數(shù)據(jù)都會(huì)被整合進(jìn)目標(biāo)代碼中,他的優(yōu)點(diǎn)就顯而易見了,即編譯后的執(zhí)行程序不需要外部的函數(shù)庫(kù)支持,因?yàn)樗惺褂玫暮瘮?shù)都已經(jīng)被編譯進(jìn)去了。當(dāng)然這也會(huì)成為他的缺點(diǎn),因?yàn)槿绻o態(tài)函數(shù)庫(kù)改變了,那么你的程序必須重新編譯。
unix中,使用ar命令創(chuàng)建或者操作靜態(tài)庫(kù)
ar???? archivefile objfile
archivefile:archivefile是靜態(tài)庫(kù)的名稱
objfile:objfile是已.o為擴(kuò)展名的中間目標(biāo)文件名,可以多個(gè)并列;
例如:
g++?-o?hello.o?-c?hello.cpp ar?cqs?libHello.a?hello.o
相關(guān)推薦:《Linux視頻教程》