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