linux環境下程序搜索動態庫路徑和加載相關操作


 

前言:

在linux下編譯程序運行時,因為涉及到動態庫加載搜索問題,老是會出現加載失敗的現象出現,現在整理一下相關知識,供下次遇到問題查看。

 

linux下程序尋找動態庫路徑:

  • 1.編譯生成時,指定的搜索路徑。

  在makefile中,一般使用”-Wl -rpath”來指明程序運行時到哪個路徑去找庫。當指定多個動態庫搜索路徑時,路徑之間用冒號隔開,不能有空格。

  • 2.環境變量LD_LIBRARY_PATH中指定的路徑。

       可以使用 echo LD_LIBRARY_PATH查看。一般初始時/lib和/user/lib庫包含在里面。用戶可以往里面添加。

  • 3./etc/ld.so.cache中緩存的路徑。

       /etc/ld.so.conf的第一行有一個引用命令:include ld.so.conf.d/*.conf, 所以可以通過修改/etc/ls.so.conf這個配置文件來增刪路徑,也可以增加一個.conf文件來配置特有的動態庫路徑。直接將尋庫路徑加進來即可,保存后需要運行一下ldconfig重載一下。

  • 4.默認的/lib/和/usr/lib。

  這兩個路徑是系統最初就添加在LD_LIBRARY_PATH中,所以將庫移動到這里亦可以尋找到。

 

動態庫相關命令:

  • 1.ld 查看gcc鏈接程序。
  • 2.ldd查看可執行程序中所依賴的庫的程序,后面直接接可執行程序名即可查看該程序需要鏈接的庫已經庫路徑,如果沒找到的庫會找不到的提示。
  • 3.ldconfig是用來更新/etc/ld.so.conf的修改生效。
  • 4.nm是用來查看.so庫的函數名,標記是T的就是動態庫里面生成的名字.

 

Linux下動態庫搜索路徑順序問題

以下按優先級排序:

  • 1.編譯目標代碼時指定的動態庫搜索路徑;
  • 2.環境變量LD_LIBRARY_PATH指定的動態庫搜索路徑;
  • 3.配置文件/etc/ld.so.conf中指定的動態庫搜索路徑;
  • 4.默認動態庫搜索路徑/lib;
  • 5.默認動態庫搜索路徑/usr/lib;

 

動態庫增添方法:

1.在LD_LIBRARY_PATH中增加路徑。

  export LD_LIBRARY_PATH=LD_LIBRARY_PATH:/XXX

  這種方式時臨時有效,一旦登出就失效了。

2.修改~./bashrc或~/.bash_profile或系統級別的/etc/profile

       export PATH=/wangqinghe/lib:$LD_LIBRARY_PATH

       source .bashrc (source命令通常用於重新執行剛修改的初始化文件,使之立刻生效,而不必注銷並重新登錄)。

3.在/etc/ld.so.conf中增加路徑,或者在/etc/文件目錄下增加 *.conf文件去配置自己獨有的尋庫路徑。修改之后要ldconfig一下。

 

補充:

ldconfig 命令的用途,主要是在默認搜尋目錄(/lib和/usr/lib)以及動態庫配置文件/etc/ld.so.conf內所列的目錄下,搜索出可共享的動態鏈接庫(格式如前介紹,lib*.so*),進而創建出動態裝入程序(ld.so)所需的連接和緩存文件.緩存文件默認為/etc/ld.so.cache,此文件保存已排好序的動態鏈接庫名字列表.)

 

說明:

程序運行時不會把當前目錄作為默認的尋庫路徑,除非你在編譯時指定了。

個人覺得在makefile時指定尋庫路徑比較好一些,因為它在程序員的控制之中,如果出了問題可以一一排除。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM