Linux系統中新增庫檔案路徑的方法
庫檔案在連結(靜態庫和共享庫)和執行(僅限於使用共享庫的程式)時被使用,其搜尋路徑是在系統中進行設定的。一般 Linux 系統把 /lib 和 /usr/lib 兩個目錄作為預設的庫搜尋路徑,所以使用這兩個目錄中的庫時不需要進行設定搜尋路徑即可直接使用。但是,對於處於預設庫搜尋路徑之外的庫,就需要將庫的位置新增到庫的搜尋路徑之中。設定庫檔案的搜尋路徑有下列兩種方式,可任選其一使用:
- 在環境變數
LD_LIBRARY_PATH
中指明庫的搜尋路徑。 - 在
/etc/ld.so.conf
檔案中新增庫的搜尋路徑。
方法一
要在 Linux 系統中新增庫路徑,我們很容易想到環境變數 LD_LIBRARY_PATH
$ export LD_LIBRARY_PATH=<your-lib-path>:$LD_LIBRARY_PATH
例如:
$ export LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH
可以用如下命令檢視 LD_LIBRAY_PATH
是否設定成功。
$ echo $LD_LIBRARY_PATH
要注意的是,這種方法只是臨時設定環境變數 LD_LIBRARY_PATH
,重啟或開啟新的 Shell 之後,一切設定將不復存在。為了讓這種方法更完美一些,可以將該 LD_LIBRARY_PATH
export
語句寫到系統檔案中,例如 /etc/profile
、/etc/export
、~/.bashrc
或者 ~/.bash_profile
等等。 寫在不同檔案對該語句的讀取時機會有所不同,例如,
~/.bashrc
在每次登陸和每次開啟 shell 都讀取一次,而 ~/.bash_profile
只在登陸時讀取一次。但是對於嵌入式Linux來說,有些檔案可能沒有,這就需要根據目標機器的情況來設定了。我一般是加到 ~/.bashrc
中,將 export 語句新增在該檔案的未尾。修改完後,還差一步,使配置生效!可以開啟一個 Shell,或者使用 source
或 .
(點命令)使配置檔案生效。如:$ source ~/.bashrc
方法二
將自己可能存放庫檔案的路徑都加入到 /etc/ld.so.conf
中是明智的選擇,因為這種新增庫路徑的效果是永久的。新增方法也很簡單,將庫檔案的絕對路徑直接寫進去就OK了,一行一個。例如:
/usr/X11R6/lib
/usr/local/lib
/opt/lib
需要注意的是:這種搜尋路徑的設定方式對於程式連線時的庫(包括共享庫和靜態庫)的定位已經足夠了,但是對於使用了共享庫的程式的執行還是不夠的。這是因為為了加快程式執行時對共享庫的定位速度,避免使用搜索路徑查詢共享庫的低效率,所以是直接讀取庫列表檔案 /etc/ld.so.cache
從中進行搜尋的。
/etc/ld.so.cache
是一個非文字的資料檔案,不能直接編輯,它是根據 /etc/ld.so.conf
中設定的搜尋路徑由 /sbin/ldconfig
命令將這些搜尋路徑下的共享庫檔案集中在一起而生成的(ldconfig 命令要以 root 許可權執行)。因此,為了保證程式執行時對庫的定位,在 /etc/ld.so.conf
中進行了庫搜尋路徑的設定之後,還必須要執行 /sbin/ldconfig
命令更新 /etc/ld.so.cache
檔案之後才可以。
簡單的說,ldconfig
的作用就是將 /etc/ld.so.conf
列出的路徑下的庫檔案快取到 /etc/ld.so.cache
以供使用。因此當安裝完一些庫檔案(例如剛安裝好 glib),或者修改 ld.so.conf
增加新的庫路徑後,需要執行一下 /sbin/ldconfig
使所有的庫檔案都被快取到 ld.so.cache
中。如果沒做,即使庫檔案明明就在 /usr/lib
下的,也是不會被使用的,結果編譯過程中抱錯,缺少xxx庫,去檢視發現明明就在那放著,搞的想大罵 computer 蠢豬一個。
除了修改 /etc/ld.so.conf
,還可以在 /etc/ld.so.conf.d
目錄下新增 *.conf
檔案,然後往該檔案新增搜尋路徑。同樣,需要執行 ldconfig 使之生效。