c/c++程式在linux下被編譯和連線時,gcc/g++會查詢系統預設的include和link的路徑,以及自己在編譯命令中指定的路徑。自己指定的路徑就不說了,這裡說明一下系統自動搜尋的路徑。
include標頭檔案路徑
除了預設的/usr/include, /usr/local/include等include路徑外,還可以通過設定環境變數來新增系統include的路徑:
# c
export c_include_path=***x:$c_include_path
# cpp
export cplus_include_path=***:$cplus_include_path
以上修改可以直接命令列輸入(一次性),可以在/etc/profile中完成(對所有使用者生效),也可以在使用者home目錄下的.bashrc或.bash_profile中新增(針對某個使用者生效),修改完後重新登入即生效。
link鏈結庫檔案路徑
鏈結庫檔案在連線(靜態庫和共享庫)和執行(僅限於使用共享庫的程式)時被使用,其搜尋路徑是在系統中進行設定的(也可以在編譯命令中通過 -l -l 來指定,這裡講的是使用系統預設搜尋路徑)。
一般 linux 系統把 /lib /usr/lib /usr/local/lib 作為預設的庫搜尋路徑,所以使用這幾個目錄中的鏈結庫檔案可直接被搜尋到(不需要專門指定鏈結庫路徑)。對於預設搜尋路徑之外的庫,則需要將其所在路徑新增到gcc/g++的搜尋路徑之中。
鏈結庫檔案的搜尋路徑指定有兩種方式:1)修改/etc/so.ld.conf 2)修改環境變數,在其中新增自己的路徑
1)在環境變數中新增
動態鏈結庫搜尋路徑:
export ld_library_path=***:$ld_library_path
靜態鏈結庫搜尋路徑:
export library_path=***:$library_path
以上修改可以直接命令列輸入(一次性
),可以
在/etc/profile中完成(對所有使用者生效
),也可以在
使用者home目錄
下的.bashrc或.bash_profile
中新增(針對某個使用者生效
),修改完後重新登入即生效。
2)在/etc/ld.so.conf 中新增指定的鏈結庫搜尋路徑(需要root許可權),然後執行 /sbin/ldconfig,以達到重新整理 /etc/ld.so.cache的效果。
以上兩種方式均可以達到指定鏈結庫搜尋路徑的效果。
第二種搜尋路徑的設定方式對於程式連線時的庫(包括共享庫和靜態庫) 的定位已經足夠了,但是對於使用了共享庫的程式的執行還是不夠的。這是因為為了加快程式執行時對共享庫的定位速度,避免使用搜尋路徑查詢共享庫的低效率,系統會直接讀取 /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中,不然修改的內容就等於沒有生效。
在程式連線時,對於庫檔案(靜態庫和共享庫)的搜尋路徑,除了上面的設定方式之外,還可以通過 -l 和 -l 參數顯式指定。因為用 -l 設定的路徑將被優先搜尋,所以在連線的時候通常都會以這種方式直接指定要連線的庫的路徑。
注意:
1)在配置環境變數的時候,
等號前面不要加空格,否則可能出現 command not found
2)修改/etc/ld.so.conf後,當系統重新啟動後,所有基於 gtk2 的程式在執行時都將使用新安裝的 gtk+ 庫。由於 gtk+ 版本的改變,有時會給應用程式帶來相容性的問題,造成某些程式執行不正常。為了避免出現這些情況,在 gtk+ 及其依賴庫的安裝過程中對於庫的搜尋路徑的設定將採用環境變數的方式
export ld_library_path=/opt/gtk/lib:$ld_library_path
Linux標頭檔案及動態庫路徑設定
對於開源的第三方的庫,在make make install之後,一版會把庫安裝到 usr local lib,把頭檔案安裝到 usr local include目錄。linux把 lib和 usr lib兩個目錄作為預設的庫搜尋路徑,所以使用這兩個目錄的庫時,不需要進行庫搜尋路徑設定,可以直接使用。...
標頭檔案和庫檔案的區別
標頭檔案中有函式的申明,庫檔案實現函式的定義。比如,printf函式。使用時應包括stdio.h,開啟stdio.h你只能看到,printf這 個函式的申明,卻看不到printf具體是怎麼實現的,而函式的實現在相應的c庫 中。而庫檔案一般是以二進位制形式而不是c原始檔形式提供給使用者使用的。程式 中...
Linux系統的標頭檔案和庫檔案搜尋路徑
linux系統的標頭檔案和庫檔案搜尋路徑 include的header檔案,鏈結資料庫,系統定義,總共有下列 指定gcc去那找。當初在編譯時指定的 在 gcc gcc collect2.c locatelib 寫在specs內的 後來用 d i l指定的 gcc環境變數設定 編譯的時候 ld.so的...