工程里很多函數(shù)只是有聲明,,找不到實(shí)現(xiàn)的代碼,。因?yàn)槟切?shí)現(xiàn)代碼已經(jīng)編譯成庫(kù)所以看不見(jiàn),我所看見(jiàn)的全是一堆頭文件. 優(yōu)點(diǎn):程序模塊化,,容易重新編譯,方便升級(jí),。 分類:靜態(tài)函數(shù)庫(kù)(對(duì)應(yīng).a文件),、共享函數(shù)庫(kù)(對(duì)應(yīng).so文件,類似于Windows的dll文件),、動(dòng)態(tài)加載函數(shù)庫(kù)(對(duì)應(yīng).o文件,,相當(dāng)于Windows里的.obj文件) 靜態(tài)函數(shù)庫(kù) 特點(diǎn):實(shí)際上是簡(jiǎn)單的普通目標(biāo)文件的集合,在程序執(zhí)行前就加入到目標(biāo)程序中,。 優(yōu)點(diǎn):可以用以前某些程序兼容,;描述簡(jiǎn)單;允許程序員把程序link起來(lái)而不用重新編譯代碼,,節(jié)省了重新編譯代碼的時(shí)間(該優(yōu)勢(shì)目前已不明顯),;開(kāi)發(fā)者可以對(duì)源代碼保密;理論上使用ELF格式的靜態(tài)庫(kù)函數(shù)生成的代碼可以比使用共享或動(dòng)態(tài)函數(shù)庫(kù)的程序運(yùn)行速度快(大概1%-5%) 生成:使用ar程序(archiver的縮寫(xiě)),。ar rcs my_lib.a f1.o f2.o是把目標(biāo)代碼f1.o和f2.o加入到my_lib.a這個(gè)函數(shù)庫(kù)文件中(如果my_lib.a不存在則創(chuàng)建) 使用:用gcc生成可執(zhí)行代碼時(shí),,使用-l參數(shù)指定要加入的庫(kù)函數(shù),。也可以用ld命令的-l和-L參數(shù)。 共享函數(shù)庫(kù) soname:必須的格式:lib+函數(shù)庫(kù)名+.so+版本號(hào)信息(但是記住,,非常底層的C庫(kù)函數(shù)都不是以lib開(kāi)頭命名的)。例子:/usr/lib/libreadline.so.3 real name:顧名思義是真正的名字啦,,有主版本號(hào)和發(fā)行版本號(hào),。但是沒(méi)找到實(shí)例…… 編譯器編譯的時(shí)候需要的函數(shù)庫(kù)的名字就是不包含版本號(hào)信息的soname,例如上面的例子把最后的.3去掉就可以了,。 位置:共享函數(shù)庫(kù)文件必須放在特定目錄,,對(duì)于開(kāi)放源碼來(lái)說(shuō),GNU標(biāo)準(zhǔn)建議所有的函數(shù)庫(kù)文件都放在/usr/local/lib目錄下,,而且建議命令,、可執(zhí)行程序都放在/usr/local/bin目錄下。不過(guò)這個(gè)只是習(xí)慣啦,,可以改變,,具體的位置信息可以看/etc/ld.so.conf里面的配置信息。當(dāng)然,,也可以修改這個(gè)文件,,加入自己的一些特殊的路徑要求。 創(chuàng)建:在網(wǎng)上找到了gcc方式和easyeclipse環(huán)境下兩種創(chuàng)建方式,。 gcc方式: 在easyeclipse環(huán)境下生成.so文件: #ifdef #extern #endif 頭文件主體 #ifdef } #endif 安裝:拷貝共享庫(kù)文件到指定的標(biāo)準(zhǔn)的目錄,然后運(yùn)行ldconfig,。如果沒(méi)有權(quán)限這樣做,,那么就只好通過(guò)修改環(huán)境變量來(lái)實(shí)現(xiàn)這些函數(shù)庫(kù)的使用了。方法不再說(shuō)了,,很復(fù)雜,。 查看:可以通過(guò)運(yùn)行ldd來(lái)看某個(gè)程序使用的共享函數(shù)庫(kù)。例如ldd /bin/ls,。查看.so文件使用nm命令,,如nm libXXX.so。(注意,,nm對(duì)于靜態(tài)的函數(shù)庫(kù)和共享的函數(shù)庫(kù)都起作用) 關(guān)于覆蓋:如果想用自己的函數(shù)覆蓋某個(gè)庫(kù)中的一些函數(shù),,同時(shí)保留該庫(kù)中其他的函數(shù)的話,可以在/etc/ld.so.preload中加入要替換的庫(kù)(.o結(jié)尾的文件),,這些preloading的庫(kù)函數(shù)將有優(yōu)先加載的權(quán)利,。 關(guān)于更新:每次新增加動(dòng)態(tài)加載的函數(shù)庫(kù)、刪除某個(gè)函數(shù)庫(kù)或者修改某個(gè)函數(shù)庫(kù)的路徑時(shí),,都要重新運(yùn)行ldconfig來(lái)更新/etc/ld.so.cache |
|
來(lái)自: 每天學(xué)一點(diǎn)7 > 《雜記》