linux下gcc默認搜索頭文件及庫文件的路徑


一、頭文件
gcc 在編譯時如何去尋找所需要的頭文件:
※所以header file的搜尋會從-I開始
※然后找gcc的環境變量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH
※再找內定目錄
/usr/include
/usr/local/include
/usr/lib/gcc-lib/i386-linux/2.95.2/include
/usr/lib/gcc-lib/i386-linux/2.95.2/……/……/……/……/include/g++-3
/usr/lib/gcc-lib/i386-linux/2.95.2/……/……/……/……/i386-linux/include
庫文件但是如果裝gcc的時候,是有給定的prefix的話,那么就是
/usr/include
prefix/include
prefix/xxx-xxx-xxx-gnulibc/include
prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include
二、庫文件
cos()等函式庫的選項要多加 -lm
編譯的時候:
※gcc會去找-L
※再找gcc的環境變量LIBRARY_PATH
※再找內定目錄 /lib /usr/lib /usr/local/lib 這是當初compile gcc時寫在程序內的
三、運行時動態庫的搜索路徑
1、在配置文件/etc/ld.so.conf中指定動態庫搜索路徑
2、通過環境變量LD_LIBRARY_PATH指定動態庫搜索路徑(當通過該環境變量指定多個動態庫搜索路徑時,路徑之間用冒號":"分隔)
3、在編譯目標代碼時指定該程序的動態庫搜索路徑(還可以在編譯目標代碼時指定程序的動態庫搜索路徑。
這是通過gcc 的參數"-Wl,-rpath,"指定(如例3所示)。當指定多個動態庫搜索路徑時,路徑之間用冒號":"分隔)
4、默認的動態庫搜索路徑/lib
5、默認的動態庫搜索路徑/usr/lib
可以通過執行可執行文件pos得到的結果不同獲知其搜索到了哪個動態庫,從而獲得第1個動態庫搜索順序,然后刪除該動態庫,
再執行程序pos,獲得第2個動態庫搜索路徑,再刪除第2個被搜索到的動態庫,
如此往復,將可得到Linux搜索動態庫的先后順序。
程序pos執行的輸出結果和搜索到的動態庫的對應關系如表1所示
程序pos輸出結果使用的動態庫對應的動態庫搜索路徑指定方式
。/ ./libpos.so 編譯目標代碼時指定的動態庫搜索路徑
/root/test/env/lib /root/test/env/lib/libpos.so環境變量LD_LIBRARY_PATH指定的動態庫搜索路徑
/root/test/conf/lib /root/test/conf/lib/libpos.so配置文件/etc/ld.so.conf中指定的動態庫搜索路徑
/lib /lib/libpos.so 默認的動態庫搜索路徑/lib
/usr/lib /usr/lib/libpos.so 默認的動態庫搜索路徑/usr/lib
綜合以上結果可知,動態庫的搜索路徑搜索的先后順序是:
1.編譯目標代碼時指定的動態庫搜索路徑;
2.環境變量LD_LIBRARY_PATH指定的動態庫搜索路徑;
3.配置文件/etc/ld.so.conf中指定的動態庫搜索路徑;
4.默認的動態庫搜索路徑/lib;
5.默認的動態庫搜索路徑/usr/lib.

 

 

LIBRARY_PATH和LD_LIBRARY_PATH是Linux下的兩個環境變量,二者的含義和作用分別如下:

 

LIBRARY_PATH環境變量用於在程序編譯期間查找動態鏈接庫時指定查找共享庫的路徑,例如,指定gcc編譯需要用到的動態鏈接庫的目錄。

 

LD_LIBRARY_PATH環境變量用於在程序加載運行期間查找動態鏈接庫時指定除了系統默認路徑之外的其他路徑,注意,LD_LIBRARY_PATH中指定的路徑會在系統默認路徑之前進行查找。

 

區別與使用:

開發時,設置LIBRARY_PATH,以便gcc能夠找到編譯時需要的動態鏈接庫。

發布時,設置LD_LIBRARY_PATH,以便程序加載運行時能夠自動找到需要的動態鏈接庫。

 


 

開發時設置LIBRARY_PATH動態鏈接庫,以便gcc能夠找到,
release時設置LD_LIBRARY_PATH以便程序加載時能夠自動找到

gcc -L 自定義 lib路徑

vim /etc/profile或者vim /etc/bashrc追家如下一行
export LIBRARY_PATH=/usr/local/lib/gliethttp_lib1:/usr/local/lib/gliethttp_lib2:$LIBRARY_PATH
加入上面一行保證gcc時能夠找到庫,等效於gcc -L/usr/local/lib/gliethttp_lib1 -L/usr/local/lib/gliethttp_lib2


4、gcc默認動態庫目錄:/lib:/usr/lib:usr/lib64:/usr/local/lib等。 

 2)添加庫文件路徑:
LIBRARY_PATH    #used by gcc before compilation to search for directories containing libraries that need to be linked to your program.
LD_LIBRARY_PATH    #used by your program to search for directories containing the libraries after it has been successfully compiled and linked.

例如:
MATLAB=/opt/MATLAB/R2012a
export LIBRARY_PATH=$LIBRARY_PATH:$MATLAB/bin/glnxa64
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$MATLAB/bin/glnxa64

題外話,順便提一下LIBRARY_PATH和LD_LIBRARY_PATH的區別:
我們知道Linux下有2種庫:static libraries和shared libraries。如(這里)闡述的,靜態庫是在編譯期間會被鏈接並拷貝到你的程序中,因此運行時不再需要該靜態庫。動態庫在編譯時並不會被拷貝到你的程序中,而是在程序運行時才被載入,因此在程序運行時還需要動態庫存在,這時就會用到LD_LIBRARY_PATH指定的路徑去查找這個動態庫。The libraries can be static or shared. If it is static then the code is copied over into your program and you don't need to search for the library after your program is compiled and linked. If your library is shared then it needs to be dynamically linked to your program and that's when LD_LIBRARY_PATH comes into play.

 

 

 

Linux添加環境變量與GCC編譯器添加INCLUDE與LIB環境變量

對所有用戶有效在/etc/profile增加以下內容。只對當前用戶有效在Home目錄下的
.bashrc或.bash_profile里增加下面的內容:
(注意:等號前面不要加空格,否則可能出現 command not found)

#在PATH中找到可執行文件程序的路徑。
export PATH =$PATH:$HOME/bin

#gcc找到頭文件的路徑
C_INCLUDE_PATH=/usr/include/libxml2:/MyLib
export C_INCLUDE_PATH

#g++找到頭文件的路徑
CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/include/libxml2:/MyLib
export CPLUS_INCLUDE_PATH

#找到動態鏈接庫的路徑
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/MyLib
export LD_LIBRARY_PATH

#找到靜態庫的路徑
LIBRARY_PATH=$LIBRARY_PATH:/MyLib
export LIBRARY_PATH


庫 文件在連接(靜態庫和共享 庫)和運行(僅限於使用共享庫的程序)時被使用,其搜索路徑是在系統中進行設置的。一般 Linux 系統把 /lib 和 /usr/lib 兩個目錄作為默認的庫搜索路徑,所以使用這兩個目錄中的庫時不需要進行設置搜索路徑即可直接使用。對於處於默認庫搜索路徑之外的庫,需要將庫的位置添加到 庫的搜索路徑之中。設置庫文件的搜索路徑有下列兩種方式,可任選其一使用:

 

在環境變量 LD_LIBRARY_PATH 中指明庫的搜索路徑。

 

在 /etc/ld.so.conf 文件中添加庫的搜索路徑。

 

將自己可能存放庫文件的路徑都加入到/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蠢豬一個。

 

在程序連接時,對於庫文件(靜態庫和共享庫)的搜索路徑,除了上面的設置方式之外,還可以通過 -L 參數顯式指定。因為用 -L 設置的路徑將被優先搜索,所以在連接的時候通常都會以這種方式直接指定要連接的庫的路徑。

 

前 面已經說明過了,庫搜索路徑的設置有兩種方式:在環境變量 LD_LIBRARY_PATH 中設置以及在 /etc/ld.so.conf 文件中設置。其中,第二種設置方式需要 root 權限,以改變 /etc/ld.so.conf 文件並執行 /sbin/ldconfig 命令。而且,當系統重新啟動后,所有的基於 GTK2 的程序在運行時都將使用新安裝的 GTK+ 庫。不幸的是,由於 GTK+ 版本的改變,這有時會給應用程序帶來兼容性的問題,造成某些程序運行不正常。為了避免出現上面的這些情況,在 GTK+ 及其依賴庫的安裝過程中對於庫的搜索路徑的設置將采用第一種方式進行。這種設置方式不需要 root 權限,設置也簡單:

 

$ export LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH

 

可以用下面的命令查看 LD_LIBRAY_PATH 的設置內容:

 

$ echo $LD_LIBRARY_PATH

 

至此,庫的兩種設置就完成了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM