linux下C/C++編譯時系統搜尋 include 和 連結庫 檔案路徑的指定
C/C++程式在linux下被編譯和連線時,GCC/G++會查詢系統預設的include和link的路徑,以及自己在編譯命令中指定的路徑。自己指定的路徑就不說了,這裡說明一下系統自動搜尋的路徑。
【1】include標頭檔案路徑
除了預設的/usr/include, /usr/local/include等include路徑外,還可以通過設定環境變數來新增系統include的路徑:
export C_INCLUDE_PATH=XXXX:$C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=XXX:$CPLUS_INCLUDE_PATH
以上修改可以直接命令列輸入(一次性),可以在/etc/profile中完成(對所有使用者生效),也可以在使用者home目錄下的.bashrc或.bash_profile中新增(針對某個使用者生效),修改完後重新登入即生效。
【2】link連結庫檔案路徑
連結庫檔案在連線(靜態庫和共享庫)和執行(僅限於使用共享庫的程式)時被使用,其搜尋路徑是在系統中進行設定的(也可以在編譯命令中通過 -l -L 來指定,這裡講的是使用系統預設搜尋路徑)。
一般 Linux 系統把 /lib /usr/lib /usr/local/lib 作為預設的庫搜尋路徑,所以使用這幾個目錄中的連結庫檔案可直接被搜尋到(不需要專門指定連結庫路徑)。對於預設搜尋路徑之外的庫,則需要將其所在路徑新增到gcc/g++的搜尋路徑之中。
連結庫檔案的搜尋路徑指定有兩種方式:1)修改/etc/so.ld.conf 2)修改環境變數,在其中新增自己的路徑
1)在環境變數中新增
動態連結庫搜尋路徑:
export LD_LIBRARY_PATH=XXX:$LD_LIBRARY_PATH
靜態連結庫搜尋路徑:
export LIBRARY_PATH=XXX:$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中,不然修改的內容就等於沒有生效。
1)在配置環境變數的時候, 等號前面不要加空格,否則可能出現 command not found
2)修改/etc/ld.so.conf後,當系統重新啟動後,所有基於 GTK2 的程式在執行時都將使用新安裝的 GTK+ 庫。由於 GTK+ 版本的改變,有時會給應用程式帶來相容性的問題,造成某些程式執行不正常。為了避免出現這些情況,在 GTK+ 及其依賴庫的安裝過程中對於庫的搜尋路徑的設定將採用環境變數的方式
export LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH
相關文章
- linux編譯時和執行時,庫搜尋路徑和順序Linux編譯
- 編譯期連結時共享庫搜尋路徑優先順序實驗編譯
- 在Linux系統中,預設的標頭檔案搜尋路徑是/usr/include和/usr/local/includLinux
- 共享庫連結和載入時的路徑搜尋優先順序
- cmake編譯指定自己編譯的庫路徑編譯
- <摘錄>Linux下動態共享庫載入時的搜尋路徑詳解Linux
- ubuntu64位系統編譯時標頭檔案找不到的問題(可以檢視g++ -v路徑,設定export C_INCLUDE_PATH,CPLUS_INCLUDE_PATH)Ubuntu編譯Export
- C++編譯連結的那些小事 .C++編譯
- C編譯: 動態連線庫 (.so檔案)編譯
- C++應用程式在Windows下的編譯、連結(四)動態連結C++Windows編譯
- C++檔案系統操作5 - 跨平臺列出指定目錄下的所有檔案和資料夾C++
- Linux執行時動態庫搜尋路徑優先順序Linux
- Linux下怎樣搜尋檔案Linux
- 【C語言】linux下多檔案編譯C語言Linux編譯
- windows 下編譯c檔案Windows編譯
- Linux下的C/C++編譯環境配置LinuxC++編譯
- C++ 預編譯標頭檔案C++編譯
- C#實現把指定資料夾下的所有檔案複製到指定路徑下以及修改指定檔案的字尾名C#
- Include檔案易犯編譯錯誤編譯
- Windows XP 增加可執行檔案的搜尋路徑(轉)Windows
- go掃描指定路徑下,檔案過多Go
- C++應用程式在Windows下的編譯、連結:第二部分COFF/PE檔案結構C++Windows編譯
- C語言中編譯和連結C語言編譯
- android下根據路徑不同拷貝檔案至指定路徑Android
- CMake連結庫,會檢索庫引用標頭檔案路徑
- windows 下c++編譯WindowsC++編譯
- 關於Linux系統中檔案系統路徑的理解(轉)Linux
- Linux下的檔案系統結構Linux
- C#檔案路徑操作總結
- C++ include標頭檔案引入規則C++
- C/C++預處理、編譯、連結過程【Z】C++編譯
- Linux檔案的路徑定位-相對路徑和絕對路徑Linux
- gcc g++ 新增標頭檔案路徑和庫檔案路徑的方法GC
- rpath增添依賴庫搜尋路徑
- Linux 檔案搜尋命令Linux
- Linux下動態共享庫 連線和載入路徑Linux
- C++ 檔案、資料夾、路徑處理函式庫:boost::filesystemC++函式
- PHP中require和include路徑問題總結PHPUI