歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux服務器 >> 如何指定gcc的默認頭文件路徑

如何指定gcc的默認頭文件路徑

日期:2017/3/2 16:39:19   编辑:Linux服務器

在交叉編譯的時候我們需要用到其他的庫,在 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 。

  S

UNPRO_OUTPUT

  為文件名設置該環境變量會令預處理程序將基於依賴關系的 makefile 規則寫入文件。會包含系統頭文件名。 如果環境變量被設置為單個名字,它將會被當作文件名,依賴關系規則中的名字將由源文件的名字中獲得。如果定義中有兩個名字,第二個名字就是依賴關系規則中的目標名。 設置該環境變量的結果與在命令行中使用參數 -M 、 -MF 和 -MT 的效果一樣。

  ==> 參見 DEPENDENCIES_OUTPUT 。

  TMPDIR

  這個變量包含了供編譯程序存放臨時工作文件的目錄的路徑名。這些文件通常在編譯過程結束時被刪除。這種文件的一個例子就是由預處理程序輸出並輸入給編譯程序的文件。

  linux 默認的 include 在哪 ?

  #include <linux/module.h> 中的 module.h 默認是在哪個目錄下呢?我在 /usr/include/linux 下並沒有找到這個文件。

  另外想問一下,不同內核版本的 linux 頭文件是不是一樣的。比如:我在 2.6.20 內核的系統上,用 2.6.10 的頭文件會不會有問題。

  網友回復 :

  1

  我的 module.h 是在 內核編譯好了的目錄下的,不是在 /usr/include/linux 下,

  2

  在 2.6.20 內核的系統上,用 2.6.10 的頭文件應該會有問題,內核的頭文件和 當前系統運行的內核不一致。

  網友回復 : 你引用的是內核下的頭文件 .

  不在 /usr/include 下 .

  在 : /usr/src/kernels/2.6.18-8.el5-x86_64/include/linux/module.h 下面 ... 中間的版本號是不一樣的 ... 你選你的就行了 ..

  網友回復 : 請問樓上為什麼是在 /usr/src/kernels/2.6.18-8.el5-x86_64/include/linux/module.h 呢?我查了一下環境變量,沒有看到關於頭文件的環境變量。 gcc 是如何知道頭文件的位置的?

  網友回復 : 這個問題很好,

  你需要看看 linux kernel 的 Makefile 文件了。在什麼地方找頭文件,它說了算。:)

  網友回復 : 你的程序是驅動之類的內核層的吧?

  它調用的頭文件就應該是內核源碼裡面的 include 了。一般的系統都把內核源碼放在 /usr/src 下面,假如是自己編譯的內核的話,也可以放在別處的。 至於 gcc 到哪裡去找頭文件,就看 makefile 了,或者直接用 gcc 命令的話,要加上 -I 來指定目錄。

  網友回復 : 樓上,可是我的 makefile 裡沒有指定 include 呀, gcc 是怎麼找到頭文件的?

  網友回復 :gcc 是怎麼找到頭文件的?

  ================================

  回答了這個問題, LZ 就明白了一切了, GCC 找頭文件有三種策略:

  1. 會在默認情況下指定到 /usr/include 文件夾 ( 更深層次的是一個相對路徑, GCC 可執行程序的路徑是 /usr/bin ,那麼它在實際工作時指定頭文件頭徑是一種相對路徑方法,換算成絕對路徑就是 /usr/include)

  2.GCC 還使用了 -I 指定路徑的方式,這一點大家都知道

  3. 還可以使用一個參數來指示 GCC 不搜索系統默認路徑,這個參數我忘了,你搜一下就知道了

  在編譯驅動模塊時,由於非凡的需求必須強制 GCC 不搜索系統默認路徑,也就是不搜索 /usr/include ,要自己用 -I 參數來指定內核頭文件路徑,這個時候必須在 Makefile 中指定兩個參數,一個是內核頭文件路徑,一個是強制 GCC 不搜索系統默認路徑。在編譯內核時,必須使用一個參數 ( 強制 GCC 不搜索系統默認路徑 ) ,否則就會引起混亂

Copyright © Linux教程網 All Rights Reserved