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