如何指定gcc的默認(rèn)頭文件路徑
如何指定gcc的默認(rèn)頭文件路徑
你還在為不知道如何指定gcc的默認(rèn)頭文件路徑而煩惱么?接下來是小編為大家收集的如何指定gcc的默認(rèn)頭文件路徑教程,希望能幫到大家。
如何指定gcc的默認(rèn)頭文件路徑
在交叉編譯的時(shí)候我們需要用到其他的庫,在 config 時(shí)候可以通過 “-I” 來指定頭文件目錄,但是每次都需要設(shè)置的話難免有些麻煩,找到一個(gè)簡(jiǎn)單的方法??聪挛牡募t色部分。
有大量的環(huán)境變量可供設(shè)置以影響 GCC 編譯程序的方式。利用這些變量的控制也可使用合適的命令行選項(xiàng)。一些環(huán)境變量設(shè)置在目錄名列表中。這些名字和 PATH 環(huán)境變量使用的格式相同。特殊字符 PATH_SEPARATOR (安裝編譯程序的時(shí)候定義)用在目錄名之間。在 UNIX 系統(tǒng)中,分隔符是冒號(hào),而 Windows 系統(tǒng)中為分號(hào)。
C_INCLUDE_PATH
編譯 C 程序時(shí)使用該環(huán)境變量。該環(huán)境變量指定一個(gè)或多個(gè)目錄名列表,查找頭文件,就好像在命令行中指定 -isystem 選項(xiàng)一樣。會(huì)首先查找 -isystem 指定的所有目錄。
==> 也見 CPATH 、 CPLUS_INCLUDE_PATH 和 OBJC_INCLUDE_PATH 。
COMPILER_PATH
該環(huán)境變量指定一個(gè)或多個(gè)目錄名列表,如果沒有指定 GCC_EXEC_PREFIX 定位子程序,編譯程序會(huì)在此查找它的子程序。
==> 也見 LIBRARY_PATH 、 GCC_EXEC_PREFIX 和 -B 命令行選項(xiàng)。
CPATH
編譯 C 、 C++ 和 Objective-C 程序時(shí)使用該環(huán)境變量。該環(huán)境變量指定一個(gè)或多個(gè)目錄名列表,查找頭文件,就好像在命令行中指定 -l 選項(xiàng)一樣。會(huì)首先查找 -l 指定的所有目錄。
==> 也見 C_INCLUDE_PATH 、 CPLUS_INCLUDE_PATH 和 OBJC_INCLUDE_PATH 。
CPLUS_INCLUDE_PATH
編譯 C++ 程序時(shí)使用該環(huán)境變量。該環(huán)境變量指定一個(gè)或多個(gè)目錄名列表,查找頭文件,就好像在命令行中指定 -isystem 選項(xiàng)一樣。會(huì)首先查找 -isystem 指定的所有目錄。
==> 也見 CPATH 、 C_INCLUDE_PATH 和 OBJC_INCLUDE_PATH 。
DEPENDENCIES_OUTPUT
為文件名設(shè)置該環(huán)境變量會(huì)讓預(yù)處理程序?qū)⒒谝蕾囮P(guān)系的 makefile 規(guī)則寫入文件。不會(huì)包括系統(tǒng)頭文件名字。
如果環(huán)境變量設(shè)置為單名,被看作是文件名字,而依賴關(guān)系規(guī)則的名字來自源文件名字。如果定義中有兩個(gè)名字,則第二個(gè)名字是用作依賴關(guān)系規(guī)則的目標(biāo)名。 設(shè)置該環(huán)境變量的結(jié)果和使用命令行選項(xiàng) -MM 、 -MF 和 -MT 的組合是一樣的。
==> 也見 SUNPRO_DEPENDENCIES 。
GCC_EXEC_PREFIX
如果定義了該環(huán)境變量,它會(huì)作為編譯程序執(zhí)行的所有子程序名字的前綴。例如,如果將變量設(shè)置為 testver 而不是查找 as ,匯編器首先會(huì)在名字 testveras 下查找。如果在此沒有找到,編譯程序會(huì)繼續(xù)根據(jù)它的普通名進(jìn)行查找??稍谇熬Y名中使用斜線指出路徑名。
GCC_EXEC_PREFIX 的默認(rèn)設(shè)置為 prefix /lib/gcc-lib/ ,這里的 prefix 是安裝編譯程序時(shí) configure 腳本指定的名字。該前綴也用于定位標(biāo)準(zhǔn)連接程序文件,包含進(jìn)來作為可執(zhí)行程序的一部分。
如果使用 -B 命令行選項(xiàng),會(huì)重寫該設(shè)置。
==> 也見 COMPILER_PATH 。
LANG 該環(huán)境變量用于指出編譯程序使用的字符集,可創(chuàng)建寬字符文字、串文字和注釋。
定義 LANG 為 C-JIS ,指出預(yù)處理程序?qū)⒍嘧止?jié)字符按照 JIS (日語工業(yè)標(biāo)準(zhǔn))字符進(jìn)行解釋。 C-SJIS 可用來指出 Shift -JIS 字符而 C-EUCJP 指出日文 EUC 。
如果沒有定義 LANG ,或定義為不可識(shí)別,函數(shù) mblen() 被用來確定字符寬度,而 mbtowc() 用來將多字節(jié)序列轉(zhuǎn)換為寬字符。
LC_ALL 如果設(shè)置,該環(huán)境變量的值重寫 LC_MESSAGES 和 LC_CTYPE 的所有設(shè)置。
LC_CTYPE 該環(huán)境變量指出引用串中定義的多字節(jié)字符的字符分類。主要用于確定字符串的字符邊界,字符編碼需要用引號(hào)或轉(zhuǎn)義符,可被錯(cuò)誤地解釋為字符串的結(jié)尾或特殊字 符串。對(duì) Australian English ,可將它設(shè)置為 en_AU ; 對(duì) Mexican Spanish ,可將它設(shè)置為 es_MX 。如果沒有設(shè)置該變量,默認(rèn)為 LANG 變量的值,或如果沒有設(shè)置 LANG ,那就使用 C 英語行為。也見 LC_ALL 。
LC_MESSAGES 該環(huán)境變量指出編譯程序使用何種語言發(fā)出診斷消息。對(duì) Australian English ,可設(shè)置為 en_AU ; 對(duì) MexicanSpanish ,可設(shè)置為 es_MX 。如果變量沒有設(shè)置,使用 LANG 變量的默認(rèn)值,或如果沒有設(shè)置 LANG ,那就使用 C 英語行為。也見 LC_ALL 。
LD_LIBRARY_PATH 該環(huán)境變量不會(huì)影響編譯程序,但程序運(yùn)行的時(shí)候會(huì)有影響。變量指定一個(gè)目錄列表,程序會(huì)查找該列表定位共享庫。只有當(dāng)未在編譯程序的目錄中找到共享庫的時(shí)候,執(zhí)行程序必須設(shè)置該變量。LD_RUN_PATH 該環(huán)境變量不會(huì)影響編譯程序,但程序運(yùn)行的時(shí)候會(huì)有影響。該變量在運(yùn)行時(shí)指出文件的名字,運(yùn)行的程序可由此得到它的符號(hào)名字和地址。地址不會(huì)重新載入,因而可能符號(hào)引用其他文件中的絕對(duì)地址。這和 ld 工具使用 -R 選項(xiàng)完全一樣。
LIBRARY_PATH
該環(huán)境變量可設(shè)置為一個(gè)或多個(gè)目錄名字列表,連接程序會(huì)搜尋該目錄,以查找特殊連接程序文件,和由 -l (字母 l )命令行選項(xiàng)指定名字的庫。 由 -L 命令行選項(xiàng)指定的目錄在環(huán)境變量的前面,首先被查找。
==> 也見 COMPILER_PATH 。
OBJC_INCLUDE_PATH
在編譯 Objective-C 程序的時(shí)候使用該環(huán)境變量。一個(gè)或多個(gè)目錄名的列表由環(huán)境變量指定,用來查找頭文件,就好像在命令行中指定 -isystem 選項(xiàng)一樣。所有由 -isystem 選項(xiàng)指定的目錄會(huì)首先被查找。
==> 也見 CPATH 、 CPLUS_INCLUDE_PATH 和 C_INCLUDE_PATH 。
SUNPRO_OUTPUT
為文件名設(shè)置該環(huán)境變量會(huì)令預(yù)處理程序?qū)⒒谝蕾囮P(guān)系的 makefile 規(guī)則寫入文件。會(huì)包含系統(tǒng)頭文件名。 如果環(huán)境變量被設(shè)置為單個(gè)名字,它將會(huì)被當(dāng)作文件名,依賴關(guān)系規(guī)則中的名字將由源文件的名字中獲得。如果定義中有兩個(gè)名字,第二個(gè)名字就是依賴關(guān)系規(guī)則中的目標(biāo)名。 設(shè)置該環(huán)境變量的結(jié)果與在命令行中使用參數(shù) -M 、 -MF 和 -MT 的效果一樣。
==> 參見 DEPENDENCIES_OUTPUT 。
TMPDIR
這個(gè)變量包含了供編譯程序存放臨時(shí)工作文件的目錄的路徑名。這些文件通常在編譯過程結(jié)束時(shí)被刪除。這種文件的一個(gè)例子就是由預(yù)處理程序輸出并輸入給編譯程序的文件。
linux 默認(rèn)的 include 在哪 ?
#include <linux/module.h> 中的 module.h 默認(rèn)是在哪個(gè)目錄下呢?我在 /usr/include/linux 下并沒有找到這個(gè)文件。
另外想問一下,不同內(nèi)核版本的 linux 頭文件是不是一樣的。比如:我在 2.6.20 內(nèi)核的系統(tǒng)上,用 2.6.10 的頭文件會(huì)不會(huì)有問題。
網(wǎng)友回復(fù) :
1
我的 module.h 是在 內(nèi)核編譯好了的目錄下的,不是在 /usr/include/linux 下,
2
在 2.6.20 內(nèi)核的系統(tǒng)上,用 2.6.10 的頭文件應(yīng)該會(huì)有問題,內(nèi)核的頭文件和 當(dāng)前系統(tǒng)運(yùn)行的內(nèi)核不一致。
網(wǎng)友回復(fù) : 你引用的是內(nèi)核下的頭文件 .
不在 /usr/include 下 .
在 : /usr/src/kernels/2.6.18-8.el5-x86_64/include/linux/module.h 下面 ... 中間的版本號(hào)是不一樣的 ... 你選你的就行了 ..
網(wǎng)友回復(fù) : 請(qǐng)問樓上為什么是在 /usr/src/kernels/2.6.18-8.el5-x86_64/include/linux/module.h 呢?我查了一下環(huán)境變量,沒有看到關(guān)于頭文件的環(huán)境變量。 gcc 是如何知道頭文件的位置的?
網(wǎng)友回復(fù) : 這個(gè)問題很好,
你需要看看 linux kernel 的 Makefile 文件了。在什么地方找頭文件,它說了算。:)
網(wǎng)友回復(fù) : 你的程序是驅(qū)動(dòng)之類的內(nèi)核層的吧?
它調(diào)用的頭文件就應(yīng)該是內(nèi)核源碼里面的 include 了。一般的系統(tǒng)都把內(nèi)核源碼放在 /usr/src 下面,假如是自己編譯的內(nèi)核的話,也可以放在別處的。 至于 gcc 到哪里去找頭文件,就看 makefile 了,或者直接用 gcc 命令的話,要加上 -I 來指定目錄。
網(wǎng)友回復(fù) : 樓上,可是我的 makefile 里沒有指定 include 呀, gcc 是怎么找到頭文件的?
網(wǎng)友回復(fù) :gcc 是怎么找到頭文件的?
回答了這個(gè)問題, LZ 就明白了一切了, GCC 找頭文件有三種策略:
1. 會(huì)在默認(rèn)情況下指定到 /usr/include 文件夾 ( 更深層次的是一個(gè)相對(duì)路徑, GCC 可執(zhí)行程序的路徑是 /usr/bin ,那么它在實(shí)際工作時(shí)指定頭文件頭徑是一種相對(duì)路徑方法,換算成絕對(duì)路徑就是 /usr/include)
2.GCC 還使用了 -I 指定路徑的方式,這一點(diǎn)大家都知道
3. 還可以使用一個(gè)參數(shù)來指示 GCC 不搜索系統(tǒng)默認(rèn)路徑,這個(gè)參數(shù)我忘了,你搜一下就知道了
在編譯驅(qū)動(dòng)模塊時(shí),由于非凡的需求必須強(qiáng)制 GCC 不搜索系統(tǒng)默認(rèn)路徑,也就是不搜索 /usr/include ,要自己用 -I 參數(shù)來指定內(nèi)核頭文件路徑,這個(gè)時(shí)候必須在 Makefile 中指定兩個(gè)參數(shù),一個(gè)是內(nèi)核頭文件路徑,一個(gè)是強(qiáng)制 GCC 不搜索系統(tǒng)默認(rèn)路徑。在編譯內(nèi)核時(shí),必須使用一個(gè)參數(shù) ( 強(qiáng)制 GCC 不搜索系統(tǒng)默認(rèn)路徑 ) ,否則就會(huì)引起混亂。
看了“如何指定gcc的默認(rèn)頭文件路徑”還想看: