GCC編譯選項和環境變量

本文由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_PATHCPLUS_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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章