本文由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<file>類型的標頭檔,要不就和-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