GCC編譯選項和環境變數

2022-08-22 19:33:12 字數 4243 閱讀 3113

本文由gcc手冊翻譯得到,英語能力有限,翻譯得不太好,僅為自己做記錄,用於理解gcc編譯時標頭檔案及庫檔案的查詢路徑問題。

-idir

表示增加dir為標頭檔案的搜尋路徑,這個路徑優先於系統的預設路徑,所以用自己指定的標頭檔案來替代系統預設的標頭檔案。但是不要用這個選項來指定路徑不要包括**商提供的系統標頭檔案(這個情況可以用-isystem),如果有多個-i選項,則路徑的搜尋先後順序是從左到右的。,即在前面的路徑會被選搜尋。另外,如果dir以=號開頭即如–i=dir,而其中的=號為被sysroot字首替換。

如果乙個標準系統包含的目錄或者用-isystem選項指定的目錄同時用了-i選項,則-i選項會被忽略。那個目錄仍然會被搜尋,只是和沒有指定-i選項時一樣。這是為了確保gcc程式能過夠修復系統標頭檔案的bug和非故意的改變include_next指令的順序。如果你確實需要改變系統路徑的搜尋順序,那你可以用」-nostdinc」 和/或者「-isystem」選項。

-nostdinc

該選項指示不要搜尋標頭檔案的標準路徑(即預設路徑),而只搜尋-i選項指定的路徑和當前路徑。

-isysroot  dir

該選項和—sysroot選項差不多,但只用於搜尋標頭檔案。

--sysroot=dir

用dir作為標頭檔案和庫檔案的邏輯根目錄,例如,正常情況下,如果編譯器在/usr/include搜尋標頭檔案,在/usr/lib下搜尋庫檔案,它將用dir/usr/include和dir/usr/lib替代原來的相應路徑。如果你同時使用了-isysroot選項,則—sysroot會應用於庫檔案的搜尋而-isysroot會用於搜尋標頭檔案。

-system  dir

該選項用於搜尋標頭檔案,但該選項指定的目錄估在-i選項指定的目錄後搜尋而在系統預設路徑前搜尋。如果dir前有「=」號,則該「=」號會被sysroot字首替換。

-iquotedir

增加用於搜尋#include 「file」型別的標頭檔案的路徑,並且不搜尋#include型別的標頭檔案,要不就和-i選項一樣了。

-ldir

增加-l選項指定的庫檔案的搜尋路徑,即編譯器會到dir路徑下搜尋-l指定的庫檔案。

-bprefix

這個選項指定gcc到哪去查詢自己的可執行檔案、庫檔案、標頭檔案和資料檔案。編譯器驅動程式執行乙個或多個子程式如ccp,cc1,as,ld。當編譯器需要執行某個子程式時,它將prefix作業子程式的字首(如prefix/as)。為了正確執行每個子程式,編譯器驅動程式首先-b選項指定的字首,如果那個可檔案(如prefix/as)沒有查詢到或者沒有指定-b選項,則編譯器驅動程式將嘗試使用標準字首:/usr/lib/gcc/ 和/usr/local/lib/gcc/。如果用這兩個字首也沒查詢到,則使用沒有修改過的程式名(如as)在path環境變數指定的路徑下查詢。

編譯器會核查-b選項提供的字首(目錄),必要情況下編譯器會在最後加乙個分隔符。如-b/usr/bin  則最後的字首會為:/usr/bin/,編譯器在最後增加了分隔符。

-b選項指定的字首同樣對鏈結器查詢庫檔案有效,因為編譯器會將該選項轉換為-l選項。另外-b選項同樣也對預處理器查詢標頭檔案時有效,因為編譯器會將該選項轉換為預處理器中的-isystem選項,在這種情況下,編譯器會在prefix最後加上「include」即prefix/include。

如果需要,執行時庫檔案「libgcc.a」同樣會通過-b選項指定的字首來查詢,如果沒找到,則接著會嘗試用上面提到的那兩個標準字首查詢,如果還沒有找到,則會忽略掉對libgcc.a的鏈結。

另外一種指定prefix字首的方式是通過環境變數

gcc_exec_prefix來指定,不過會在-b選項指定的字首之後搜尋。即先嘗試用-b選項指定的字首再嘗試使用gcc_exec_prefix指定的字首,再用標準字首。其實前面提到的兩個標準字首應該是在安裝編譯器是指它的!!所以每個系統可能還不一樣。

-specs=file

為了覆蓋gcc傳遞給cc1、cc1plus、as、ld等子程式的預設開關選項,編譯器會在讀取標準的「specs」檔案後再處理file檔案。如果在-specs中指定了多個檔案,則這些檔案會被按照從左到右的順序來處理。

-print-file-name=library

列印出鏈結時將用到的library的絕對路徑,這樣可以看看鏈結的是不是確實是自己想要的庫檔案。

-print-libgcc-file-name

列印出所使用的libgcc.a檔案的路徑,這個特別是在使用了-nostdlib或者-nodefaultlibs選項時有用。等價於-print-file-name=libgcc.a

-print-search-dirs

列印出gcc安裝路徑、程式列表和gcc標準的預設搜尋路徑。

-print-sysroot-headers-suffix

列印出頭檔案的根目錄。

-dumpmachine

列印出gcc編譯的程式的目標機器。

-dumpspecs

列印出gcc的內建specs檔案,這個檔案在編譯gcc時會用到。

gcc_exec_prefix

該環境變數用於指定編譯器子程式(如as,cc1等)的字首,編譯器不會給該字首增加「/」,但你可以自己增加。如果gcc_exec_prefix變數沒有設定的話,gcc會嘗試gcc所在路徑為字首。如果用指定的字首沒有找到子程式的話,gcc將在預設位置查詢子程式。

gcc_exec_prefix的預設值為:『prefix/lib/gcc/』這裡的prefix為安裝gcc時指定的prefix,一般與configure配置時指定的一樣。

用-b指定的字首會在該環境變數字首前先搜尋。該環境變數指定的字首同樣也用於查詢鏈結所需的檔案如「crt0.o」.

除此之外,gcc還用這個指定的字首來搜尋標頭檔案,對於乙個標準標頭檔案的目錄來說一般都以「/usr/local/lib/gcc」(更精確定的是用gcc_include_dir來指定),gcc首先會嘗試用gcc_exec_prefix指定的字首去替換掉「/usr/local/lib/gcc」查詢標頭檔案,然後才在標準的字首目錄下搜尋標頭檔案。

compiler_path

gcc在該環境變數指定的目錄下查詢子程式,但是會在gcc_exec_prefix指定的目錄後搜尋。

library_path

gcc如果在gcc_exec_prefix沒有找到鏈結檔案的話,然後會在該環境變數指定的目錄下查詢鏈結檔案,另外還在-l指定的目錄後搜尋。

cpath

c_include_path

cplus_include_path

這些變數指定的目錄的分隔符為分號(windows),或者為冒號(linux)。cpath指定的路徑的功能與-i項指定的一樣,只是會在-i選項指定的目錄後查詢,另外對任何語言都適用。其它的兩個環境變數是對特定語言的,同-isystem選項一樣,但會在-system選項指定的目錄後搜尋。在這些環境變數中,乙個空的元素是指示編譯器在當前目錄下查詢。

總結:

用於搜尋標頭檔案的選項:

1.    -idir   -isystem dir -bprefix   -sysroot  dir  --sysroot=dir  -iquote dir

2.   gcc_exec_prefix  cpath  c_include_path、cplus_include_path

用於搜尋庫檔案的選項:

1.   -ldir   -bprefix

2.   gcc_exec_prefix

3.   library_path

用於搜尋gcc子程式的選項:

1.   -bprefix

2.   gcc_exec_prefix

3.   compiler_path

4.    gcc安裝時的路徑(可以通過gcc –print-search-dirs查詢)

5.   path

GCC編譯選項和環境變數

本文由gcc手冊翻譯得到,英語能力有限,翻譯得不太好,僅為自己做記錄,用於理解gcc編譯時標頭檔案及庫檔案的查詢路徑問題。idir 表示增加dir為標頭檔案的搜尋路徑,這個路徑優先於系統的預設路徑,所以用自己指定的標頭檔案來替代系統預設的標頭檔案。但是不要用這個選項來指定路徑不要包括 商提供的系統標...

GCC 環境變數

有大量的環境變數可供設定以影響 gcc 編譯程式的方式。利用這些變數的控制也可使用合適的命令列選項。一些環境變數設定在目錄名列表中。這些名字和 path 環境變數使用的格式相同。特殊字元 path separator 安裝編譯程式的時候定義 用在目錄名之間。在 unix 系統中,分隔符是冒號,而 w...

GCC 環境變數

一些環境變數設定在目錄名列表中。這些名字和 path 環境變數使用的格式相同。特殊字元 path separator 安裝編譯程式的時候定義 用在目錄名之間。在 unix 系統中,分隔符是冒號,而 windows 系統中為分號。c include path 編譯 c 程式時使用該環境變數。該環境變數...