https://blog.csdn.net/DLUTXIE/article/details/8176164
本文由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