歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux技術

Linux頭文件和庫文件添加環境變量與GCC編譯器添加INCLUDE與LIB環境變量

轉載:http://blog.csdn.net/crazyhacking/article/details/7371917
對所有用戶有效在/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 設置的路徑將被優先搜索,所以在連接的時候通常都會以這種方式直接指定要連接的庫的路徑。
原址:/content/3935731.html
延伸閱讀2:


linux頭文件和庫文件設置問題(轉)

當初在編譯時指定的(在~gcc/gcc/collect2.c:locatelib()
寫在specs內的
後來用-D -I -L指定的
gcc環境變量設定(編譯的時候)
ld.so的環境變量(這是run time的時候)
一、頭文件
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。

[b]如何指定GCC的默認頭文件路徑[/b]

文章來源:http://blog.chinaunix.net/u/28781/showart_401631.html
在交叉編譯的時候我們需要用到其他的庫,在config時候可以通過“-I”來指定頭文件目錄,但是每次都需要設置的話難免有些麻煩,找到一個簡單的方法。看下文的紅色部分。
有 大量的環境變量可供設置以影響 GCC 編譯程序的方式。利用這些變量的控制也可使用合適的命令行選項。一些環境變量設置在目錄名列表中。這些名字和 PATH 環境變量使用的格式相同。特殊字符 PATH_SEPARATOR (安裝編譯程序的時候定義)用在目錄名之間。在 UNIX 系統中,分隔符是冒號,而 Windows 系統中為分號。
C_INCLUDE_PATH
編譯 C 程序時使用該環境變量。該環境變量指定一個或多個目錄名列表,查找頭文件,就好像在命令行中指定 -isystem 選項一樣。會首先查找 -isystem 指定的所有目錄。
也見 CPATH 、 CPLUS_INCLUDE_PATH 和 OBJC_INCLUDE_PATH 。
COMPILER_PATH
該環境變量指定一個或多個目錄名列表,如果沒有指定 GCC_EXEC_PREFIX 定位子程序,編譯程序會在此查找它的子程序。
也見 LIBRARY_PATH 、 GCC_EXEC_PREFIX 和 -B 命令行選項。
CPATH 編譯 C 、 C++ 和 Objective-C 程序時使用該環境變量。該環境變量指定一個或多個目錄名列表,查找頭文件,就好像在命令行中指定 -l 選項一樣。會首先查找 -l 指定的所有目錄。
也見 C_INCLUDE_PATH 、 CPLUS_INCLUDE_PATH 和 OBJC_INCLUDE_PATH 。
CPLUS_INCLUDE_PATH 編譯 C++ 程序時使用該環境變量。該環境變量指定一個或多個目錄名列表,查找頭文件,就好像在命令行中指定 -isystem 選項一樣。會首先查找 -isystem 指定的所有目錄。
也見 CPATH 、 C_INCLUDE_PATH 和 OBJC_INCLUDE_PATH 。
DEPENDENCIES_OUTPUT 為文件名設置該環境變量會讓預處理程序將基於依賴關系的 makefile 規則寫入文件。不會包括系統頭文件名字。
如果環境變量設置為單名,被看作是文件名字,而依賴關系規則的名字來自源文件名字。如果定義中有兩個名字,則第二個名字是用作依賴關系規則的目標名。
設置該環境變量的結果和使用命令行選項 -MM 、 -MF 和 -MT 的組合是一樣的。也見 SUNPRO_DEPENDENCIES 。
GCC_EXEC_PREFIX 如果定義了該環境變量,它會作為編譯程序執行的所有子程序名字的前綴。例如,如果將變量設置為 testver 而不是查找 as ,匯編器首先會在名字testveras 下查找。如果在此沒有找到,編譯程序會繼續根據它的普通名進行查找。可在前綴名中使用斜線指出路徑名。
GCC_EXEC_PREFIX 的默認設置為 prefix /lib/gcc-lib/ ,這裡的 prefix 是安裝編譯程序時 configure 腳本指定的名字。該前綴也用於定位標准連接程序文件,包含進來作為可執行程序的一部分。
如果使用 -B 命令行選項,會重寫該設置。也見 COMPILER_PATH 。
LANG 該環境變量用於指出編譯程序使用的字符集,可創建寬字符文字、串文字和注釋。
定義 LANG 為 C-JIS ,指出預處理程序將多字節字符按照 JIS (日語工業標准)字符進行解釋。 C-SJIS 可用來指出 Shift -JIS 字符而 C-EUCJP 指出日文 EUC 。
如果沒有定義 LANG ,或定義為不可識別,函數 mblen() 被用來確定字符寬度,而 mbtowc() 用來將多字節序列轉換為寬字符。
LC_ALL 如果設置,該環境變量的值重寫 LC_MESSAGES 和 LC_CTYPE 的所有設置。
LC_CTYPE 該環境變量指出引用串中定義的多字節字符的字符分類。主要用於確定字符串的字符邊界,字符編碼需要用引號或轉義符,可被錯誤地解釋為字符串的結尾或特殊字 符串。對 Australian English ,可將它設置為 en_AU ; 對 Mexican Spanish ,可將它設置為 es_MX。如果沒有設置該變量,默認為 LANG 變量的值,或如果沒有設置 LANG ,那就使用 C 英語行為。也見 LC_ALL 。
LC_MESSAGES 該環境變量指出編譯程序使用何種語言發出診斷消息。對 Australian English ,可設置為 en_AU ;對 MexicanSpanish ,可設置為 es_MX 。如果變量沒有設置,使用 LANG 變量的默認值,或如果沒有設置 LANG ,那就使用 C英語行為。也見 LC_ALL 。
LD_LIBRARY_PATH 該環境變量不會影響編譯程序,但程序運行的時候會有影響。變量指定一個目錄列表,程序會查找該列表定位共享庫。只有當未在編譯程序的目錄中找到共享庫的時候,執行程序必須設置該變量。
LD_RUN_PATH 該環境變量不會影響編譯程序,但程序運行的時候會有影響。該變量在運行時指出文件的名字,運行的程序可由此得到它的符號名字和地址。地址不會重新載入,因而可能符號引用其他文件中的絕對地址。這和 ld 工具使用 -R 選項完全一樣。
LIBRARY_PATH 該環境變量可設置為一個或多個目錄名字列表,連接程序會搜尋該目錄,以查找特殊連接程序文件,和由 -l (字母l )命令行選項指定名字的庫。
由 -L 命令行選項指定的目錄在環境變量的前面,首先被查找。也見 COMPILER_PATH 。
OBJC_INCLUDE_PATH 在編譯 Objective-C 程序的時候使用該環境變量。一個或多個目錄名的列表由環境變量指定,用來查找頭文件,就好像在命令行中指定 -isystem 選項一樣。所有由 -isystem 選項指定的目錄會首先被查找。
也見 CPATH 、 CPLUS_INCLUDE_PATH 和 C_INCLUDE_PATH 。
SUNPRO_OUTPUT 為文件名設置該環境變量會令預處理程序將基於依賴關系的 makefile 規則寫入文件。會包含系統頭文件名。
如果環境變量被設置為單個名字,它將會被當作文件名,依賴關系規則中的名字將由源文件的名字中獲得。如果定義中有兩個名字,第二個名字就是依賴關系規則中的目標名。
設置該環境變量的結果與在命令行中使用參數 -M 、 -MF 和 -MT 的效果一樣。參見 DEPENDENCIES_OUTPUT 。
TMPDIR 這個變量包含了供編譯程序存放臨時工作文件的目錄的路徑名。這些文件通常在編譯過程結束時被刪除。這種文件的一個例子就是由預處理程序輸出並輸入給編譯程序的文件
Copyright © Linux教程網 All Rights Reserved