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