三、執行時庫的連線
庫檔案在連線(靜態庫和共享庫)和執行(僅限於使用共享庫的程式)時被使用,其搜尋路徑是在系統中進行設定的。一般linux系統把/lib和/usr/lib兩個目錄作為預設的庫搜尋路徑,所以使用這兩個目錄中的庫是不需要進行設定搜尋路徑即可直接使用。對於處於預設庫搜尋路徑之外的庫,需要將庫的位置新增到 庫的搜尋路徑之中。設定庫檔案的搜尋路徑有下列兩種方式,可任選其一使用:
<1> 在環境變數 ld_library_path 中指明庫的搜尋路徑。
<2> 在/etc/ld.so.conf 檔案中新增庫的搜尋路徑。
將自己可能存放庫檔案的路徑都加入到/etc/ld.so.conf中是明智的選擇 ^_^
新增方法也極其簡單,將庫檔案的絕對路徑直接寫進去就ok了,一行乙個。例如:
? view code bash
123
/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下的,也是不會被使用的,結果編譯過程中抱錯,缺少***庫,去檢視發現明明就在那放著,搞的想大罵computer蠢豬乙個。 ^_^
在程式連線時,對於庫檔案(靜態庫和共享庫)的搜尋路徑,除了上面的設定方式之外,還可以通過-l參數顯式指定。因為用-l設定的路徑將被優先搜尋,所以在連線的時候通常都會以這種方式直接指定要連線的庫的路徑。
前面已經說明過了,庫搜尋路徑的設定有兩種方式:在環境變數ld_library_path中設定以及在/etc/ld.so.conf檔案中設定。其中,第二種設定方式需要root許可權,以改變/etc/ld.so.conf檔案並執行/sbin/ldconfig命令。而且,當系統重新啟動後,所有的基於gtk2的程式在執行時都將使用新安裝的gtk+庫。不幸的是,由於gtk+版本的改變,這有時會給應用程式帶來相容性的問題,造成某些程式執行不正常。為了避免出現上面的這些情況,在gtk+及其依賴庫的安裝過程中對於庫的搜尋路徑的設定將採用第一種方式進行。這種設定方式不需要root許可權,設定也簡單:
? view code bash
1
$exportld_library_path=/opt/gtk/lib:$ld_library_path
可以用下面的命令檢視 ld_libray_path 的設定內容:
? view code bash
1
$echo$ld_library_path
至此,庫的兩種設定就完成了。
gcc指定標頭檔案路徑及動態鏈結庫路徑
include 直接到系統指定的某些目錄中去找某些標頭檔案。include 先到原始檔所在資料夾去找,然後再到系統指定的某些目錄中去找某些標頭檔案。1.會在預設情況下指定到 usr include資料夾 更深層次的是乙個相對路徑,gcc可執行程式的路徑是 usr bin gcc,那麼它在實際工作時指...
gcc指定標頭檔案及動態鏈結庫路徑
在利用源 進行軟體編譯的過程中,經常會出現以下錯誤 include 直接到系統指定的某些目錄中去找某些標頭檔案。include 先到原始檔所在資料夾去找,然後再到系統指定的某些目錄中去找某些標頭檔案。那麼gcc如何確定標頭檔案搜尋路徑呢?q 檔案路徑有多種,那麼先後順序如何?i 指定的路徑 gcc ...
動態鏈結庫 靜態鏈結庫
包含標頭檔案和庫 idir 指定編譯查詢標頭檔案的目錄,常用於查詢第三方的庫的標頭檔案,例 gcc test.c i.inc o test。ldir 指定鏈結時查詢lib的目錄,常用於查詢第三方庫。llibrary 指定額外鏈結的lib庫 巨集定義 dmacro 以字串 1 預設值 定義 macro...