C語(yǔ)言如何制作庫(kù)文件
庫(kù)是一組預(yù)先編譯好的函數(shù)的集合,這些函數(shù)都是按照可重用的原則編寫的。標(biāo)準(zhǔn)庫(kù)的存放位置為/lib/或者usr/lib目錄中。
庫(kù)文件的命名:總是以lib開頭,隨后的部分指明是什么庫(kù),例如libc是c庫(kù),libm是數(shù)學(xué)庫(kù)等。文件名的最后部分以.開始,然后給出庫(kù)文件的類型:
.a:表示傳統(tǒng)的靜態(tài)函數(shù)庫(kù)
.so:代表共享函數(shù)庫(kù)
這條命令要求編譯文件fred.c,將編譯產(chǎn)生的文件名命名為fred,并且除了搜索標(biāo)準(zhǔn)的C語(yǔ)言函數(shù)庫(kù)外,還要搜索數(shù)學(xué)庫(kù)libm.a解決函數(shù)引用問題。雖然函數(shù)庫(kù)文件存放在標(biāo)準(zhǔn)的路徑之下,但是也可以使用-L為編譯器指明需要增加的函數(shù)庫(kù)搜索路徑。
這條命令用/usr/openwin/lib目錄中的libx11庫(kù)來(lái)編譯和鏈接程序x11fred.
即:
上文所說的-lx11,指的就是需要依賴libx11庫(kù)。使用-l(小寫L)的形式的好處是:如果動(dòng)態(tài)庫(kù)存在的情況下,會(huì)優(yōu)先使用動(dòng)態(tài)庫(kù)。
靜態(tài)庫(kù):
靜態(tài)庫(kù)也稱為歸檔文件:archive,按照慣例這種類型的文件都以.a結(jié)尾。
創(chuàng)建靜態(tài)庫(kù)文件分三步:
1、分別創(chuàng)建為每一個(gè)函數(shù)創(chuàng)建一個(gè)源文件。
2、使用gcc -c 命令將源文件編譯成為.o文件,因?yàn)榇藭r(shí)的兩個(gè)源文件并不能組成程序。
3、檢查兩個(gè)源文件準(zhǔn)確無(wú)誤后,使用下列命令對(duì)其進(jìn)行打包:
xxx.o表示需要打包的.o文件,可以是多個(gè)。
4、為庫(kù)文件生成內(nèi)容表
這樣,庫(kù)文件就能正常使用了。
靜態(tài)庫(kù)的缺點(diǎn):
多個(gè)運(yùn)行中的應(yīng)用程序同事使用同一個(gè)函數(shù)庫(kù)的函數(shù)時(shí),內(nèi)存中就會(huì)存在同一函數(shù)的多個(gè)副本,而且在程序文件自身中也同時(shí)存在多份同樣的副本,這將消耗大量寶貴的內(nèi)存和磁盤空間。
共享庫(kù)
共享庫(kù)的保存位置與靜態(tài)庫(kù)是一樣的,但共享庫(kù)有不同的文件名后綴。當(dāng)一個(gè)程序使用共享庫(kù)時(shí),他的鏈接方式是這樣的:
程序本身不再包含函數(shù)代碼,而是引用運(yùn)行時(shí)可訪問的共享代碼。當(dāng)編譯好的程序被裝載到內(nèi)存中執(zhí)行時(shí),函數(shù)引用被解析并產(chǎn)生對(duì)共享庫(kù)的調(diào)用,如果有必要,共享庫(kù)才會(huì)被加載到內(nèi)存中。
通過這種方式,系統(tǒng)可以只保留共享庫(kù)的一份副本供許多應(yīng)用程序同時(shí)使用,并且在磁盤上也保留一份,另一份的好處是共享庫(kù)的更新可以獨(dú)立于依賴他的應(yīng)用程序。