1、靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)
所謂的庫(kù),其實(shí)都是一些二進(jìn)制的可執(zhí)行文件集合,靜態(tài)庫(kù)在linux中一般命名形式為libxxx.a,而動(dòng)態(tài)庫(kù)一般常用libxxx.so。
他們都可以通過(guò)源文件編譯得到,往期對(duì)這兩種庫(kù)都過(guò)介紹:
Linux應(yīng)用編程之靜態(tài)庫(kù)的制作與使用
Linux應(yīng)用編程之動(dòng)態(tài)庫(kù)的制作與使用
Linux應(yīng)用編程之動(dòng)靜態(tài)鏈接庫(kù)輔助技巧(ldd,-static)
對(duì)于靜態(tài)庫(kù)主要是用于程序編譯的過(guò)程中提供相應(yīng)的函數(shù)實(shí)現(xiàn),最終使用到該靜態(tài)庫(kù)中的內(nèi)容會(huì)整合到最終的程序中,這樣程序在運(yùn)行過(guò)程中就不再依賴外部其他庫(kù)了。
而動(dòng)態(tài)庫(kù)并不是用于編譯期,而是在運(yùn)行期通過(guò)動(dòng)態(tài)加載器來(lái)加載庫(kù)函數(shù),使得可執(zhí)行程序得以運(yùn)行,當(dāng)然動(dòng)態(tài)鏈接也分不同的加載時(shí)期,相對(duì)比較靈活,有些程序一運(yùn)行就需要進(jìn)行加載,而有些的動(dòng)態(tài)庫(kù)是在執(zhí)行過(guò)程中加載。
2、動(dòng)靜態(tài)庫(kù)優(yōu)缺點(diǎn)
那么動(dòng)態(tài)庫(kù)與靜態(tài)庫(kù)的優(yōu)缺點(diǎn)也比較明顯,使用靜態(tài)庫(kù)編譯生成的可執(zhí)行文件對(duì)外界沒(méi)有什么需求,依賴少,相應(yīng)的其可執(zhí)行程序體積變大,一旦修改需要重新編譯。
而對(duì)于動(dòng)態(tài)庫(kù),由于是程序運(yùn)行時(shí)候加載相應(yīng)的動(dòng)態(tài)庫(kù),所以其可執(zhí)行文件相對(duì)要小很多,同時(shí)對(duì)于庫(kù)的修改,僅僅編譯和替換相應(yīng)的動(dòng)態(tài)庫(kù)即可,更加的方便。
3、Linux中動(dòng)態(tài)庫(kù)的查找
由于可執(zhí)行程序依賴動(dòng)態(tài)鏈接庫(kù),所以存在一個(gè)問(wèn)題:從哪里找動(dòng)態(tài)鏈接庫(kù)?,經(jīng)常我們動(dòng)態(tài)編譯的可執(zhí)行應(yīng)用程序,由于系統(tǒng)中、或者自己沒(méi)有指定相應(yīng)的庫(kù)路徑,就會(huì)報(bào)運(yùn)行失敗,提示缺少相應(yīng)的庫(kù)。
這樣就需要在系統(tǒng)中安裝對(duì)應(yīng)的庫(kù),并且把庫(kù)放在動(dòng)態(tài)加載器所能搜索到的位置,在linux中有如下幾種搜索路徑:
1、在可執(zhí)行程序編譯的時(shí)候通過(guò)編譯選項(xiàng)指定相應(yīng)的動(dòng)態(tài)庫(kù)路徑,這樣在程序運(yùn)行的時(shí)候就會(huì)在文件系統(tǒng)對(duì)應(yīng)路徑加載對(duì)應(yīng)的動(dòng)態(tài)庫(kù),比如通過(guò)使用-Wl,-rpath=your path來(lái)進(jìn)行編譯,編譯成功的可執(zhí)行程序你可以使用ldd命令來(lái)查看是否路徑指定成功,可執(zhí)行程序幾乎是第一時(shí)間搜索該路徑查看動(dòng)態(tài)庫(kù)是否存在。
2、通過(guò)使用環(huán)境變量 : LD_LIBRARY_PATH指定,可以使用如下命令進(jìn)行查看:
1echo $LD_LIBRARY_PATH
通過(guò)export在已有的路徑上進(jìn)行添加:
1export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:your path
跟之前給大家介紹的PATH環(huán)境變量的使用是一致的,當(dāng)可執(zhí)行程序找到指定路徑,會(huì)在該環(huán)境變量中指定的路徑進(jìn)行查找,當(dāng)然修改該環(huán)境變量會(huì)影響到所有的應(yīng)用程序動(dòng)態(tài)加載的搜索。
3、系統(tǒng)默認(rèn)的路徑/lib和/user/lib進(jìn)行搜索,當(dāng)然在用戶級(jí)的程序大部分都會(huì)安裝在/usr/local中,所以用戶級(jí)的庫(kù)大部分也會(huì)放在/user/local/lib路徑中。
4、當(dāng)然在Ubuntu中還通常在配置文件/etc/ld.so.conf中指定的動(dòng)態(tài)庫(kù)搜索路徑,不過(guò)要記得當(dāng)我們把相應(yīng)的動(dòng)態(tài)庫(kù)路徑添加進(jìn)入以后,需要使用ldconfig進(jìn)行配置才能生效。
最 后
好了,這里小哥就簡(jiǎn)單介紹了動(dòng)態(tài)庫(kù)與靜態(tài)庫(kù)的差異,以及Linux系統(tǒng)一般如何搜索動(dòng)態(tài)庫(kù),本系列文章后續(xù)還會(huì)更新,記得關(guān)注學(xué)習(xí)哦。
-
Linux
+關(guān)注
關(guān)注
87文章
11292瀏覽量
209326 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4327瀏覽量
62569 -
靜態(tài)庫(kù)
+關(guān)注
關(guān)注
0文章
21瀏覽量
7426
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論