天天看點

解決linux找不到動态庫的問題

動态庫即共享庫,說到linux找不到動态庫的問題,首先要了解動态庫的特點:

  1. 動态庫把對一些庫函數的連結載入推遲到程式運作的時期。
  2. 可以實作程序之間的資源共享。(是以動态庫也稱為共享庫)
  3. 将一些程式更新變得簡單。
  4. 甚至可以真正做到連結載入完全由程式員在程式代碼中控制(顯示調用)。

由上述中的第1點可知,動态庫并不是像靜态庫那樣将庫檔案以二進制形式打包到程式中,而是在程式運作到需要調用對應庫函數這個時機的時候動态加載動态庫,這時候系統隻知道動态庫的名字,而不知道絕對路徑,此時就需要系統動态載入器(dynamic linker/loader);對于elf的可執行程式,是由ld-linux.so來完成的,它先後搜尋elf檔案的DT_RPATH段(不可控) =》 環境變量LD_LIBRARY_PATH =》 /etc/ld.so.cache檔案清單 =》 /lib/和/usr/lib 目錄找到庫檔案後載入記憶體。

那麼我們需要做的就是将動态庫所在目錄的絕對路徑加到動态載入器搜尋序的任一次序中,下面說具體實作方法:

  • 方法1:拷貝自己制作的共享庫到/lib或/usr/lib,不推薦
  • 方法2:将動态庫所在目錄的絕對路徑添加到系統環境變量中
  • 2.1、将動态庫所在目錄的絕對路徑臨時添加到環境變量中(随終端關閉失效)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/chiliast/homework/day03/shared/lib
  • 2.2、将動态庫所在目錄的絕對路徑設定到~/.bashrc或/etc/profile中(永久生效)
  • 使用者級别:追加庫路徑到~/.bashrc檔案尾

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/chiliast/homework/day03/shared/lib

source ~/.bashrc 或 . ~/.bashrc使配置生效

  • 系統級别:追加庫路徑到/etc/profile檔案尾

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/chiliast/homework/day03/shared/lib

source /etc/profile 或 ./etc/profile使配置生效

  • 方法3:将動态庫所在目錄的絕對路徑添加到 /etc/ld.so.cache檔案中(2步實作)

編輯/etc/ld.so.conf檔案,加入庫檔案所在目錄的路徑

運作ldconfig (需要super user權限),該指令會重建/etc/ld.so.cache檔案

繼續閱讀