linux中動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)的區(qū)別是什么

區(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)生的文件比較大。

linux中動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)的區(qū)別是什么

本教程操作環(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視頻教程

以上就是

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊5 分享