1. 程式人生 > >gcc/g++命令引數中文幫助手冊

gcc/g++命令引數中文幫助手冊

GCC 1

Section: GNU Tools (1)
Updated: 2003/12/05
Other Links: GNU GPL Chinese

NAME

gcc,g++-GNU工程的C和C++編譯器(egcs-1.1.2)

總覽(SYNOPSIS)

gcc[option|filename ]…
g++[option|filename ]…

警告(WARNING)

本手冊頁內容摘自GNU C編譯器的完整文件,僅限於解釋選項的含義.

除非有人自願維護,否則本手冊頁不再更新.如果發現手冊頁和軟體之間有所矛盾,請查對Info檔案, Info檔案是權威文件.

如果我們發覺本手冊頁的內容由於過時而導致明顯的混亂和抱怨時,我們就停止釋出它.不可能有其他選擇,象更新Info檔案同時更新man手冊,因為其他維護GNU CC的工作沒有留給我們時間做這個. GNU工程認為man手冊是過時產物,應該把時間用到別的地方.

如果需要完整和最新的文件,請查閱Info檔案`gcc’或Using and Porting GNU CC (for version 2.0) (使用和移植GNU CC 2.0) 手冊.二者均來自Texinfo原檔案 gcc.texinfo.

描述(DESCRIPTION)

C和C++編譯器是整合的.他們都要用四個步驟中的一個或多個處理輸入檔案: 預處理(preprocessing),編譯(compilation),彙編(assembly)和連線(linking).原始檔字尾名標識原始檔的 語言,但是對編譯器來說,字尾名控制著預設設定:

gcc

認為預處理後的檔案(.i)是C檔案,並且設定C形式的連線.

g++

認為預處理後的檔案(.i)是C++檔案,並且設定C++形式的連線.

原始檔字尾名指出語言種類以及後期的操作:

.c C源程式;預處理,編譯,彙編

.C C++源程式;預處理,編譯,彙編

.cc C++源程式;預處理,編譯,彙編

.cxx C++源程式;預處理,編譯,彙編

.m Objective-C源程式;預處理,編譯,彙編

.i 預處理後的C檔案;編譯,彙編

.ii 預處理後的C++檔案;編譯,彙編

.s 組合語言源程式;彙編

.S 組合語言源程式;預處理,彙編

.h 前處理器檔案;通常不出現在命令列上

其他字尾名的檔案被傳遞給聯結器(linker).通常包括:

.o 目標檔案(Object file)

.a 歸檔庫檔案(Archive file)

除非使用了-c, -S,或-E選項(或者編譯錯誤阻止了完整的過程),否則連線總是 最後的步驟.在連線階段中,所有對應於源程式的.o檔案, -l庫檔案,無法識別的檔名(包括指定的 .o目標檔案和.a庫檔案)按命令列中的順序傳遞給聯結器.

選項(OPTIONS)

選項必須分立給出: -dr'完全不同於-d -r ‘.

大多數-f'和-W’選項有兩個相反的格式: -fname和 -fno-name (或-Wname和-Wno-name).這裡 只列舉不是預設選項的格式.

下面是所有選項的摘要,按型別分組,解釋放在後面的章節中.

總體選項(Overall Option)

-c -S -E -o file -pipe -v -x language

語言選項(Language Option)

-ansi -fall-virtual -fcond-mismatch -fdollars-in-identifiers -fenum-int-equiv -fexternal-templates -fno-asm -fno-builtin -fhosted -fno-hosted -ffreestanding -fno-freestanding -fno-strict-prototype -fsigned-bitfields -fsigned-char -fthis-is-variable -funsigned-bitfields -funsigned-char -fwritable-strings -traditional -traditional-cpp -trigraphs

警告選項(Warning Option)

-fsyntax-only -pedantic -pedantic-errors -w -W -Wall -Waggregate-return -Wcast-align -Wcast-qual -Wchar-subscript -Wcomment -Wconversion -Wenum-clash -Werror -Wformat -Wid-clash-len -Wimplicit -Wimplicit-int -Wimplicit-function-declaration -Winline -Wlong-long -Wmain -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -Wno-import -Wparentheses -Wpointer-arith -Wredundant-decls -Wreturn-type -Wshadow -Wstrict-prototypes -Wswitch -Wtemplate-debugging -Wtraditional -Wtrigraphs -Wuninitialized -Wunused -Wwrite-strings

除錯選項(Debugging Option)

-a -dletters -fpretend-float -g -glevel -gcoff -gxcoff -gxcoff+ -gdwarf -gdwarf+ -gstabs -gstabs+ -ggdb -p -pg -save-temps -print-file-name=library -print-libgcc-file-name -print-prog-name=program

優化選項(Optimization Option)

-fcaller-saves -fcse-follow-jumps -fcse-skip-blocks -fdelayed-branch -felide-constructors -fexpensive-optimizations -ffast-math -ffloat-store -fforce-addr -fforce-mem -finline-functions -fkeep-inline-functions -fmemoize-lookups -fno-default-inline -fno-defer-pop -fno-function-cse -fno-inline -fno-peephole -fomit-frame-pointer -frerun-cse-after-loop -fschedule-insns -fschedule-insns2 -fstrength-reduce -fthread-jumps -funroll-all-loops -funroll-loops -O -O2 -O3

前處理器選項(Preprocessor Option)

-Aassertion -C -dD -dM -dN -Dmacro[=defn] -E -H -idirafter dir -include file -imacros file -iprefix file -iwithprefix dir -M -MD -MM -MMD -nostdinc -P -Umacro -undef

彙編器選項(Assembler Option)

-Wa,option

聯結器選項(Linker Option)

-llibrary -nostartfiles -nostdlib -static -shared -symbolic -Xlinker option -Wl,option -u symbol

目錄選項(Directory Option)

-Bprefix -Idir -I- -Ldir

目標機選項(Target Option)

-b machine -V version

配置相關選項(Configuration Dependent Option)

M680x0 選項
-m68000 -m68020 -m68020-40 -m68030 -m68040 -m68881 -mbitfield -mc68000 -mc68020 -mfpa -mnobitfield -mrtd -mshort -msoft-float

VAX選項
-mg -mgnu -munix

SPARC選項
-mepilogue -mfpu -mhard-float -mno-fpu -mno-epilogue -msoft-float -msparclite -mv8 -msupersparc -mcypress

Convex選項
-margcount -mc1 -mc2 -mnoargcount

AMD29K選項
-m29000 -m29050 -mbw -mdw -mkernel-registers -mlarge -mnbw -mnodw -msmall -mstack-check -muser-registers

M88K選項
-m88000 -m88100 -m88110 -mbig-pic -mcheck-zero-division -mhandle-large-shift -midentify-revision -mno-check-zero-division -mno-ocs-debug-info -mno-ocs-frame-position -mno-optimize-arg-area -mno-serialize-volatile -mno-underscores -mocs-debug-info -mocs-frame-position -moptimize-arg-area -mserialize-volatile -mshort-data-num -msvr3 -msvr4 -mtrap-large-shift -muse-div-instruction -mversion-03.00 -mwarn-passed-structs

RS6000選項
-mfp-in-toc -mno-fop-in-toc

RT選項
-mcall-lib-mul -mfp-arg-in-fpregs -mfp-arg-in-gregs -mfull-fp-blocks -mhc-struct-return -min-line-mul -mminimum-fp-blocks -mnohc-struct-return

MIPS選項
-mcpu=cpu type -mips2 -mips3 -mint64 -mlong64 -mmips-as -mgas -mrnames -mno-rnames -mgpopt -mno-gpopt -mstats -mno-stats -mmemcpy -mno-memcpy -mno-mips-tfile -mmips-tfile -msoft-float -mhard-float -mabicalls -mno-abicalls -mhalf-pic -mno-half-pic -G num -nocpp

i386選項
-m486 -mno-486 -msoft-float -mno-fp-ret-in-387

HPPA選項
-mpa-risc-1-0 -mpa-risc-1-1 -mkernel -mshared-libs -mno-shared-libs -mlong-calls -mdisable-fpregs -mdisable-indexing -mtrailing-colon

i960選項
-mcpu-type -mnumerics -msoft-float -mleaf-procedures -mno-leaf-procedures -mtail-call -mno-tail-call -mcomplex-addr -mno-complex-addr -mcode-align -mno-code-align -mic-compat -mic2.0-compat -mic3.0-compat -masm-compat -mintel-asm -mstrict-align -mno-strict-align -mold-align -mno-old-align

DEC Alpha選項
-mfp-regs -mno-fp-regs -mno-soft-float -msoft-float

System V選項
-G -Qy -Qn -YP,paths -Ym,dir

程式碼生成選項(Code Generation Option)

-fcall-saved-reg -fcall-used-reg -ffixed-reg -finhibit-size-directive -fnonnull-objects -fno-common -fno-ident -fno-gnu-linker -fpcc-struct-return -fpic -fPIC -freg-struct-return -fshared-data -fshort-enums -fshort-double -fvolatile -fvolatile-global -fverbose-asm

總體選項(Overall Option)

-x language

明確指出後面輸入檔案的語言為language (而不是從檔名字尾得到的預設選擇).這個選項應用於後面 所有的輸入檔案,直到遇著下一個-x'選項. language的可選值有c’, objective-c',c-header’, c++',cpp-output’, assembler',和assembler-with-cpp’.

-x none

關閉任何對語種的明確說明,因此依據檔名字尾處理後面的檔案(就象是從未使用過`-x’選項).

如果只操作四個階段(預處理,編譯,彙編,連線)中的一部分,可以使用-x'選項(或檔名字尾)告訴 gcc從哪裡開始,用-c’, -S',或-E’選項告訴gcc到 哪裡結束.注意,某些選項組合(例如, `-x cpp-output -E’)使gcc不作任何事情.

-c

編譯或彙編原始檔,但是不作連線.編譯器輸出對應於原始檔的目標檔案.

預設情況下, GCC通過用.o'替換原始檔名字尾.c’, .i',.s’,等等,產生目標檔名.可以使用-o選項選擇其他名字.

GCC忽略-c選項後面任何無法識別的輸入檔案(他們不需要編譯或彙編).

-S

編譯後即停止,不進行彙編.對於每個輸入的非組合語言檔案,輸出檔案是組合語言檔案.

預設情況下, GCC通過用.o'替換原始檔名字尾.c’, `.i’,等等,產生 目標檔名.可以使用-o選項選擇其他名字.

GCC忽略任何不需要編譯的輸入檔案.

-E

預處理後即停止,不進行編譯.預處理後的程式碼送往標準輸出.

GCC忽略任何不需要預處理的輸入檔案.

-o file

指定輸出檔案為file.該選項不在乎GCC產生什麼輸出,無論是可執行檔案,目標檔案,彙編檔案還是 預處理後的C程式碼.

由於只能指定一個輸出檔案,因此編譯多個輸入檔案時,使用`-o’選項沒有意義,除非輸出一個可執行檔案.

如果沒有使用-o'選項,預設的輸出結果是:可執行檔案為a.out’, source.suffix '的目標檔案是source.o’,彙編檔案是 `source.s’,而預處理後的C原始碼送往標準輸出.

-v

(在標準錯誤)顯示執行編譯階段的命令.同時顯示編譯器驅動程式,前處理器,編譯器的版本號.

-pipe

在編譯過程的不同階段間使用管道而非臨時檔案進行通訊.這個選項在某些系統上無法工作,因為那些系統的 彙編器不能從管道讀取資料. GNU的彙編器沒有這個問題.

語言選項(LANGUAGE OPTIONS)

下列選項控制編譯器能夠接受的C “方言”:

-ansi

支援符合ANSI標準的C程式.

這樣就會關閉GNU C中某些不相容ANSI C的特性,例如asm, inline和 typeof關鍵字,以及諸如unix和vax這些表明當前系統型別的預定義巨集.同時開啟 不受歡迎和極少使用的ANSI trigraph特性,以及禁止`$’成為識別符號的一部分.

儘管使用了-ansi'選項,下面這些可選的關鍵字, __asm__, __extension__, __inline__和__typeof__仍然有效.你當然不會把 他們用在ANSI C程式中,但可以把他們放在標頭檔案裡,因為編譯包含這些標頭檔案的程式時,可能會指定-ansi’選項.另外一些預定義巨集,如unixvax,無論有沒有使用 `-ansi’選項,始終有效.

使用-ansi'選項不會自動拒絕編譯非ANSI程式,除非增加-pedantic’選項作為 `-ansi’選項的補充.

使用`-ansi’選項的時候,前處理器會預定義一個STRICT_ANSI巨集.有些標頭檔案 關注此巨集,以避免宣告某些函式,或者避免定義某些巨集,這些函式和巨集不被ANSI標準呼叫;這樣就不會干擾在其他地方 使用這些名字的程式了.

-fno-asm

不把asm, inline或typeof當作關鍵字,因此這些詞可以用做識別符號.用 asm, inlinetypeof能夠替代他們. -ansi' 隱含聲明瞭-fno-asm’.

-fno-builtin

不接受不是兩個下劃線開頭的內建函式(built-in function).目前受影響的函式有_exit, abort, abs, alloca, cos, exit, fabs, labs, memcmp, memcpy, sin, sqrt, strcmp, strcpy,和strlen.

`-ansi’選項能夠阻止alloca和_exit成為內建函式.

-fhosted

按宿主環境編譯;他隱含聲明瞭`-fbuiltin’選項,而且警告不正確的main函式宣告.

-ffreestanding

按獨立環境編譯;他隱含聲明瞭`-fno-builtin’選項,而且對main函式沒有特別要求.

(譯註:宿主環境(hosted environment)下所有的標準庫可用, main函式返回一個int值,典型例子是除了 核心以外幾乎所有的程式.對應的獨立環境(freestanding environment)不存在標準庫,程式入口也不一定是 main,最明顯的例子就是作業系統核心.詳情參考gcc網站最近的資料)

-fno-strict-prototype

對於沒有引數的函式宣告,例如`int foo ();’,按C風格處理—即不說明引數個數或型別. (僅針對C++).正常情況下,這樣的函式foo在C++中意味著引數為空.

-trigraphs

支援ANSI C trigraphs. -ansi'選項隱含聲明瞭-trigraphs’.

-traditional

試圖支援傳統C編譯器的某些方面.詳見GNU C手冊,我們已經把細節清單從這裡刪除,這樣當內容過時後,人們也不會 埋怨我們.

除了一件事:對於C++程式(不是C), -traditional'選項帶來一個附加效應,允許對 this賦值.他和-fthis-is-variable’選項的效果一樣.

-traditional-cpp

試圖支援傳統C前處理器的某些方面.特別是上面提到有關前處理器的內容,但是不包括 `-traditional’選項的其他效應.

-fdollars-in-identifiers

允許在識別符號(identifier)中使用$'字元(僅針對C++).你可以指定-fno-dollars-in-identifiers’選項顯明禁止使用$'符. (GNU C++在某些 目標系統預設允許$’符,但不是所有系統.)

-fenum-int-equiv

允許int型別到列舉型別(enumeration)的隱式轉換(僅限於C++).正常情況下GNU C++允許從 enum到int的轉換,反之則不行.

-fexternal-templates

為模板宣告(template declaration)產生較小的程式碼(僅限於C++),方法是對於每個模板函式 (template function),只在定義他們的地方生成一個副本.想要成功使用這個選項,你必須在所有使用模板的 檔案中,標記#pragma implementation' (定義)或#pragma interface’ (宣告).

當程式用-fexternal-templates'編譯時,模板例項(template instantiation) 全部是外部型別.你必須讓需要的例項在實現檔案中出現.可以通過typedef實現這一點,他引用所需的每個 例項.相對應的,如果編譯時使用預設選項-fno-external-templates’,所有模板例項明確的設為內建.

-fall-virtual

所有可能的成員函式預設為虛擬函式.所有的成員函式(除了構造子函式和new或delete 成員操作符)視為所在類的虛擬函式.

這不表明每次呼叫成員函式都將通過內部虛擬函式表.有些情況下,編譯器能夠判斷出可以直接呼叫某個虛擬函式;這時就 直接呼叫.

-fcond-mismatch

允許條件表示式的第二和第三個引數的型別不匹配.這種表示式的值是void.

-fthis-is-variable

允許對this賦值(僅對C++).合併使用者自定義的自由儲存管理機制到C++後,使可賦值的 this'顯得不合時宜.因此,預設情況下,類成員函式內部對this賦值是無效操作.然而為了 向後相容,你可以通過-fthis-is-variable’選項使這種操作有效.

-funsigned-char

把char定義為無符號型別,如同unsigned char.

各種機器都有自己預設的char型別.既可能是unsigned char也可能是signed char .

理想情況下,當依賴於資料的符號性時,一個可移植程式總是應該使用signed char或unsigned char.但是許多程式已經寫成只用簡單的char,並且期待這是有符號數(或者無符號數,具體情況取決於 編寫程式的目標機器).這個選項,和它的反義選項,使那樣的程式工作在對應的預設值上.

char的型別始終應該明確定義為signed char或unsigned char,即使 它表現的和其中之一完全一樣.

-fsigned-char

把char定義為有符號型別,如同signed char.

這個選項等同於-fno-unsigned-char',他是the negative form of-funsigned-char’的相反選項.同樣, -fno-signed-char'等價於-funsigned-char’.

-fsigned-bitfields

-funsigned-bitfields

-fno-signed-bitfields

-fno-unsigned-bitfields

如果沒有明確宣告signed'或unsigned’修飾符,這些選項用來定義有符號位域 (bitfield)或無符號位域.預設情況下,位域是有符號的,因為他們繼承的基本整數型別,如int,是 有符號數.

然而,如果指定了`-traditional’選項,位域永遠是無符號數.

-fwritable-strings

把字串常量儲存到可寫資料段,而且不做特別對待.這是為了相容一些老程式,他們假設字串常量是可寫的. `-traditional’選項也有相同效果.

篡改字串常量是一個非常糟糕的想法; “常量”就應該是常量.

GCC 2

Section: GNU Tools (1)
Updated: 2003/12/05
Supporter: Blackjack and more Blackjack Games built by Mike Costello

前處理器選項(Preprocessor Option)

下列選項針對C前處理器,前處理器用在正式編譯以前,對C 原始檔進行某種處理.

如果指定了-E'選項, GCC只進行預處理工作.下面的某些選項必須和-E’選項一起才 有意義,因為他們的輸出結果不能用於編譯.

-include file

在處理常規輸入檔案之前,首先處理檔案file,其結果是,檔案file的內容先得到編譯. 命令列上任何-D'和-U’選項永遠在-include file'之前處理, 無論他們在命令列上的順序如何.然而-include’和`-imacros’選項按書寫順序處理.

-imacros file

在處理常規輸入檔案之前,首先處理檔案file,但是忽略輸出結果.由於丟棄了檔案file的 輸出內容, -imacros file'選項的唯一效果就是使檔案file中的巨集定義生效, 可以用於其他輸入檔案.在處理-imacrosfile’選項之前,前處理器首先處理-D' 和-U’選項,並不在乎他們在命令列上的順序.然而-include'和-imacros’選項按書寫順序處理.

-idirafter dir

把目錄dir新增到第二包含路徑中.如果某個標頭檔案在主包含路徑(用`-I’新增的路徑)中沒有 找到,前處理器就搜尋第二包含路徑.

-iprefix prefix

指定prefix作為後續`-iwithprefix’選項的字首.

-iwithprefix dir

把目錄新增到第二包含路徑中.目錄名由prefix和dir合併而成,這裡 prefix被先前的`-iprefix’選項指定.

-nostdinc

不要在標準系統目錄中尋找標頭檔案.只搜尋`-I’選項指定的目錄(以及當前目錄,如果合適).

結合使用-nostdinc'和-I-‘選項,你可以把包含檔案搜尋限制在顯式指定的目錄.

-nostdinc++

不要在C++專用標準目錄中尋找標頭檔案,但是仍然搜尋其他標準目錄. (當建立`libg++’時使用 這個選項.)

-undef

不要預定義任何非標準巨集. (包括系統結構標誌).

-E

僅執行C前處理器.預處理所有指定的C原始檔,結果送往標準輸出或指定的輸出檔案.

-C

告訴前處理器不要丟棄註釋.配合`-E’選項使用.

-P

告訴前處理器不要產生#line'命令.配合-E’選項使用.

-M [ -MG ]

告訴前處理器輸出一個適合make的規則,用於描述各目標檔案的依賴關係.對於每個原始檔,前處理器輸出 一個make規則,該規則的目標項(target)是原始檔對應的目標檔名,依賴項(dependency)是原始檔中 #include引用的所有檔案.生成的規則可以是單行,但如果太長,就用\’-換行符續成多行.規則 顯示在標準輸出,不產生預處理過的C程式.

-M'隱含了-E’選項.

-MG'要求把缺失的標頭檔案按存在對待,並且假定他們和源程式檔案在同一目錄下.必須和-M’選項一起用.

-MM [ -MG ]

-M'選項類似,但是輸出結果僅涉及使用者標頭檔案,象這樣#include file”’.忽略系統標頭檔案如`#include ’.

-MD

-M'選項類似,但是把依賴資訊輸出在檔案中,檔名通過把輸出檔名末尾的.o’替換為 .d'產生.同時繼續指定的編譯工作----MD’不象`-M’那樣阻止正常的編譯任務.

Mach的實用工具md'能夠合併.d’檔案,產生適用於`make’命令的單一的 依賴檔案.

-MMD

和`-MD’選項類似,但是輸出結果僅涉及使用者標頭檔案,忽略系統標頭檔案.

-H

除了其他普通的操作, GCC顯示引用過的標頭檔案名.

-Aquestion(answer)

如果前處理器做條件測試,如`#if #question(answer)’,該選項可以斷言(Assert) question的答案是answer. -A-‘關閉一般用於描述目標機的標準斷言.

-Dmacro

定義巨集macro,巨集的內容定義為字串`1’.

-Dmacro=defn

定義巨集macro的內容為defn.命令列上所有的-D'選項在-U’選項之前處理.

-Umacro

取消巨集macro. -U'選項在所有的-D’選項之後處理,但是優先於任何 -include'或-imacros’選項.

-dM

告訴前處理器輸出有效的巨集定義列表(預處理結束時仍然有效的巨集定義).該選項需結合`-E’選項使用.

-dD

告訴前處理器把所有的巨集定義傳遞到輸出端,按照出現的順序顯示.

-dN

-dD'選項類似,但是忽略巨集的參量或內容.只在輸出端顯示#define name.

彙編器選項(ASSEMBLER OPTION)

-Wa,option

把選項option傳遞給彙編器.如果option含有逗號,就在逗號處分割成多個選項.

聯結器選項(LINKER OPTION)

下面的選項用於編譯器連線目標檔案,輸出可執行檔案的時候.如果編譯器不進行 連線,他們就毫無意義.

object-file-name

如果某些檔案沒有特別明確的字尾a special recognized suffix, GCC就認為他們是目標檔案或庫檔案. (根據檔案內容,聯結器能夠區分目標檔案和庫檔案).如果GCC執行連線操作,這些目標檔案將成為聯結器的輸入檔案.

-llibrary

連線名為library的庫檔案.

聯結器在標準搜尋目錄中尋找這個庫檔案,庫檔案的真正名字是`liblibrary.a’.聯結器會 當做檔名得到準確說明一樣引用這個檔案.

搜尋目錄除了一些系統標準目錄外,還包括使用者以`-L’選項指定的路徑.

一般說來用這個方法找到的檔案是庫檔案—即由目標檔案組成的歸檔檔案(archive file).聯結器處理歸檔檔案的 方法是:掃描歸檔檔案,尋找某些成員,這些成員的符號目前已被引用,不過還沒有被定義.但是,如果聯結器找到普通的 目標檔案,而不是庫檔案,就把這個目標檔案按平常方式連線進來.指定-l'選項和指定檔名的唯一區別是,-l選項用lib'和.a’把library包裹起來,而且搜尋一些目錄.

-lobjc

這個-l選項的特殊形式用於連線Objective C程式.

-nostartfiles

不連線系統標準啟動檔案,而標準庫檔案仍然正常使用.

-nostdlib

不連線系統標準啟動檔案和標準庫檔案.只把指定的檔案傳遞給聯結器.

-static

在支援動態連線(dynamic linking)的系統上,阻止連線共享庫.該選項在其他系統上無效.

-shared

生成一個共享目標檔案,他可以和其他目標檔案連線產生可執行檔案.只有部分系統支援該選項.

-symbolic

建立共享目標檔案的時候,把引用繫結到全域性符號上.對所有無法解析的引用作出警告(除非用連線編輯選項 `-Xlinker -z -Xlinker defs’取代).只有部分系統支援該選項.

-Xlinker option

把選項option傳遞給聯結器.可以用他傳遞系統特定的連線選項, GNU CC無法識別這些選項.

如果需要傳遞攜帶引數的選項,你必須使用兩次-Xlinker',一次傳遞選項,另一次傳遞他的引數. 例如,如果傳遞-assert definitions’,你必須寫成-Xlinker -assert -Xlinker definitions',而不能寫成-Xlinker “-assert definitions”’,因為這樣會把整個 字串當做一個引數傳遞,顯然這不是聯結器期待的.

-Wl,option

把選項option傳遞給聯結器.如果option中含有逗號,就在逗號處分割成多個選項.

-u symbol

使聯結器認為取消了symbol的符號定義,從而連線庫模組以取得定義.你可以使用多個 `-u’選項,各自跟上不同的符號,使得聯結器調入附加的庫模組.

目錄選項(DIRECTORY OPTION)

下列選項指定搜尋路徑,用於查詢標頭檔案,庫檔案,或編譯器的某些成員:

-Idir

在標頭檔案的搜尋路徑列表中新增dir 目錄.

-I-

任何在-I-'前面用-I’選項指定的搜尋路徑只適用於#include "file"'這種情況;他們不能用來搜尋#include ’包含的標頭檔案.

如果用-I'選項指定的搜尋路徑位於-I-‘選項後面,就可以在這些路徑中搜索所有的 `#include’指令. (一般說來-I選項就是這麼用的.)

還有, -I-'選項能夠阻止當前目錄(存放當前輸入檔案的地方)成為搜尋#include “file”’的第一選擇.沒有辦法克服-I-'選項的這個效應.你可以指定-I.’搜尋那個目錄,它在呼叫編譯器時是當前目錄.這和前處理器的預設行為不完全一樣,但是結果通常 令人滿意.

-I-'不影響使用系統標準目錄,因此,-I-‘和`-nostdinc’是不同的選項.

-Ldir

在`-l’選項的搜尋路徑列表中新增dir目錄.

-Bprefix

這個選項指出在何處尋找可執行檔案,庫檔案,以及編譯器自己的資料檔案.

編譯器驅動程式需要執行某些下面的子程式: cpp',cc1’ (或C++的 cc1plus'),as’和ld'.他把prefix當作欲執行的程式的 字首,既可以包括也可以不包括machine/version/’.

對於要執行的子程式,編譯器驅動程式首先試著加上-B'字首(如果存在).如果沒有找到檔案,或沒有指定-B’選項,編譯器接著會試驗兩個標準字首/usr/lib/gcc/'和/usr/local/lib/gcc-lib/’.如果仍然沒能夠找到所需檔案,編譯器就在`PATH’環境變數 指定的路徑中尋找沒加任何字首的檔名.

如果有需要,執行時(run-time)支援檔案libgcc.a'也在-B’字首的搜尋範圍之內. 如果這裡沒有找到,就在上面提到的兩個標準字首中尋找,僅此而已.如果上述方法沒有找到這個檔案,就不連線他了.多數 情況的多數機器上, `libgcc.a’並非必不可少.

你可以通過環境變數GCC_EXEC_PREFIX獲得近似的效果;如果定義了這個變數,其值就和上面說的 一樣用做字首.如果同時指定了-B'選項和GCC_EXEC_PREFIX變數,編譯器首先使用-B’選項,然後才嘗試環境變數值.

警告選項(WARNING OPTION)

警告是針對程式結構的診斷資訊,程式不一定有錯誤,而是存在風險,或者可能存在 錯誤.

下列選項控制GNU CC產生的警告的數量和型別:

-fsyntax-only

檢查程式中的語法錯誤,但是不產生輸出資訊.

-w

禁止所有警告資訊.

-Wno-import

禁止所有關於#import的警告資訊.

-pedantic

開啟完全服從ANSI C標準所需的全部警告診斷;拒絕接受採用了被禁止的語法擴充套件的程式.

無論有沒有這個選項,符合ANSI C標準的程式應該能夠被正確編譯(雖然極少數程式需要`-ansi’ 選項).然而,如果沒有這個選項,某些GNU擴充套件和傳統C特性也得到支援.使用這個選項可以拒絕這些程式.沒有理由 使用這個選項,他存在只是為了滿足一些書呆子(pedant).

對於替選關鍵字(他們以__'開始和結束)-pedantic’不會產生警告資訊. Pedantic 也不警告跟在extension後面的表示式.不過只應該在系統標頭檔案中使用這種轉義措施,應用程式最好 避免.

-pedantic-errors

該選項和`-pedantic’類似,但是顯示錯誤而不是警告.

-W

對下列事件顯示額外的警告資訊:

*

非易變自動變數(nonvolatile automatic variable)可能在呼叫longjmp時發生改變. 這些警告僅在優化編譯時發生.

編譯器只知道對setjmp的呼叫,他不可能知道會在哪裡呼叫longjmp,事實上一個 訊號處理例程可以在程式的任何地點呼叫他.其結果是,即使程式沒有問題,你也可能會得到警告,因為無法在可能出現問題 的地方呼叫longjmp.

*

既可以返回值,也可以不返回值的函式. (缺少結尾的函式體被看作不返回函式值)例如,下面的函式將導致這種警告:

foo (a)

{

if (a > 0)

return a;

}

由於GNU CC不知道某些函式永不返回(含有abort和longjmp),因此有可能出現 虛假警告.

*

表示式語句或逗號表示式的左側沒有產生作用(side effect).如果要防止這種警告,應該把未使用的表示式強制轉換 為void型別.例如,這樣的表示式x[i,j]'會導致警告,而x[(void)i,j]’就不會.

*

無符號數用>'或<=’和零做比較.

-Wimplicit-int

警告沒有指定型別的宣告.

-Wimplicit-function-declaration

警告在宣告之前就使用的函式.

-Wimplicit

同-Wimplicit-int和-Wimplicit-function-declaration.

-Wmain

如果把main函式宣告或定義成奇怪的型別,編譯器就發出警告.典型情況下,這個函式用於外部連線, 返回int數值,不需要引數,或指定兩個引數.

-Wreturn-type

如果函式定義了返回型別,而預設型別是int型,編譯器就發出警告.同時警告那些不帶返回值的 return語句,如果他們所屬的函式並非void型別.

-Wunused

如果某個區域性變數除了宣告就沒再使用,或者聲明瞭靜態函式但是沒有定義,或者某條語句的運算結果顯然沒有使用, 編譯器就發出警告.

-Wswitch

如果某條switch語句的引數屬於列舉型別,但是沒有對應的case語句使用列舉元素,編譯器 就發出警告. ( default語句的出現能夠防止這個警告.)超出列舉範圍的case語句同樣會 導致這個警告.

-Wcomment

如果註釋起始序列`/*’出現在註釋中,編譯器就發出警告.

-Wtrigraphs

警告任何出現的trigraph (假設允許使用他們).

-Wformat

檢查對printf和scanf等函式的呼叫,確認各個引數型別和格式串中的一致.

-Wchar-subscripts

警告型別是char的陣列下標.這是常見錯誤,程式設計師經常忘記在某些機器上char有符號.

-Wuninitialized

在初始化之前就使用自動變數.

這些警告只可能做優化編譯時出現,因為他們需要資料流資訊,只有做優化的時候才估算資料流資訊.如果不指定 `-O’選項,就不會出現這些警告.

這些警告僅針對等候分配暫存器的變數.因此不會發生在宣告為volatile的變數上面,不會發生在已經 取得地址的變數,或長度不等於1, 2, 4, 8位元組的變數.同樣也不會發生在結構,聯合或陣列上面,即使他們在 暫存器中.

注意,如果某個變數只計算了一個從未使用過的值,這裡可能不會警告.因為在顯示警告之前,這樣的計算已經被 資料流分析刪除了.

這些警告作為可選項是因為GNU CC還沒有智慧到判別所有的情況,知道有些看上去錯誤的程式碼其實是正確的.下面是 一個這樣的例子:

{

int x;

switch (y)

{

case 1: x = 1;

break;

case 2: x = 4;

break;

case 3: x = 5;

}

foo (x);

}

如果y始終是1, 2或3,那麼x總會被初始化,但是GNU CC不知道這一點.下面是 另一個普遍案例:

{

int save_y;

if (change_y) save_y = y, y = new_y;

if (change_y) y = save_y;

}

這裡沒有錯誤,因為只有設定了save_y才使用他.

把所有不返回的函式定義為volatile可以避免某些似是而非的警告.

-Wparentheses

在某些情況下如果忽略了括號,編譯器就發出警告.

-Wtemplate-debugging

當在C++程式中使用template的時候,如果除錯(debugging)沒有完全生效,編譯器就發出警告. (僅用於C++).

-Wall

結合所有上述的`-W’選項.通常我們建議避免這些被警告的用法,我們相信,恰當結合巨集的使用能夠 輕易避免這些用法。

剩下的-W...'選項不包括在-Wall’中,因為我們認為在必要情況下,這些被編譯器警告 的程式結構,可以合理的用在”乾淨的”程式中.

-Wtraditional

如果某些程式結構在傳統C中的表現和ANSI C不同,編譯器就發出警告.

*

巨集參出現在巨集體的字串常量內部.傳統C會替換巨集參,而ANSI C則視其為常量的一部分.

*

某個函式在塊(block)中宣告為外部,但在塊結束後才呼叫.

*

switch語句的運算元型別是long.

-Wshadow

一旦某個區域性變數遮蔽了另一個區域性變數,編譯器就發出警告.

-Wid-clash-len

一旦兩個確定的識別符號具有相同的前len個字元,編譯器就發出警告.他可以協助你開發一些將要在某些 過時的,危害大腦的編譯器上編譯的程式.

-Wpointer-arith

任何語句如果依賴於函式型別的大小(size)或者void型別的大小,編譯器就發出警告. GNU C為了 便於計算void *指標和函式指標,就把這些型別的大小定義為1.

-Wcast-qual

一旦某個指標強制型別轉換以便移除型別修飾符時,編譯器就發出警告.例如,如果把const char * 強制轉換為普通的char *時,警告就會出現.

-Wcast-align

一旦某個指標型別強制轉換時,導致目標所需的地址對齊(alignment)增加,編譯器就發出警告.例如,某些機器上 只能在2或4位元組邊界上訪問整數,如果在這種機型上把char 強制轉換成int 型別, 編譯器就發出警告.

-Wwrite-strings

規定字串常量的型別是const char[length],因此,把這樣的地址複製給 non-const char *指標將產生警告.這些警告能夠幫助你在編譯期間發現企圖寫入字串常量 的程式碼,但是你必須非常仔細的在宣告和原形中使用const,否則他們只能帶來麻煩;所以我們沒有讓 `-Wall’提供這些警告.

-Wconversion

如果某函式原形導致的型別轉換和無函式原形時的型別轉換不同,編譯器就發出警告.這裡包括定點數和浮點數的 互相轉換,改變定點數的寬度或符號,除非他們和預設宣告(default promotion)相同.

-Waggregate-return

如果定義或呼叫了返回結構或聯合的函式,編譯器就發出警告. (從語言角度你可以返回一個數組,然而同樣會 導致警告.)

-Wstrict-prototypes

如果函式的宣告或定義沒有指出引數型別,編譯器就發出警告. (如果函式的前向引用說明指出了引數型別,則允許後面 使用舊式風格的函式定義,而不會產生警告.)

-Wmissing-prototypes

如果沒有預先宣告函式原形就定義了全域性函式,編譯器就發出警告.即使函式定義自身提供了函式原形也會產生這個警告. 他的目的是檢查沒有在標頭檔案中宣告的全域性函式.

-Wmissing-declarations

如果沒有預先宣告就定義了全域性函式,編譯器就發出警告.即使函式定義自身提供了函式原形也會產生這個警告.這個選項 的目的是檢查沒有在標頭檔案中宣告的全域性函式.

-Wredundant-decls

如果在同一個可見域某定義多次宣告,編譯器就發出警告,即使這些重複宣告有效並且毫無差別.

-Wnested-externs

如果某extern宣告出現在函式內部,編譯器就發出警告.

-Wenum-clash

對於不同列舉型別之間的轉換髮出警告(僅適用於C++).

-Wlong-long

如果使用了long long 型別就發出警告.該警告是預設項.使用-Wno-long-long' 選項能夠防止這個警告.-Wlong-long’和-Wno-long-long'僅在-pedantic’之下才起作用.

-Woverloaded-virtual

(僅適用於C++.)在繼承類中,虛擬函式的定義必須匹配虛擬函式在基類中宣告的型別特徵(type signature).當 繼承類聲明瞭某個函式,它可能是個錯誤的嘗試企圖定義一個虛擬函式,使用這個選項能夠產生警告:就是說,當某個函式和基類 中的虛擬函式同名,但是型別特徵不符合基類的任何虛擬函式,編譯器將發出警告.

-Winline

如果某函式不能內嵌(inline),無論是宣告為inline或者是指定了-finline-functions 選項,編譯器都將發出警告.

-Werror

視警告為錯誤;出現任何警告即放棄編譯.

GCC 3

Section: GNU Tools (1)
Updated: 2003/12/05

除錯選項(DEBUGGING OPTION)

GNU CC擁有許多特別選項,既可以除錯使用者的程式,也可以對GCC排錯:

-g

以作業系統的本地格式(stabs, COFF, XCOFF,或DWARF).產生除錯資訊. GDB能夠使用這些除錯資訊.

在大多數使用stabs格式的系統上, -g'選項啟動只有GDB才使用的額外除錯資訊;這些資訊使GDB 除錯效果更好,但是有可能導致其他偵錯程式崩潰,或拒絕讀入程式.如果你確定要控制是否生成額外的資訊, 使用-gstabs+’, -gstabs',-gxcoff+’, -gxcoff',-gdwarf+’,或`-gdwarf’ (見下文).

和大多數C編譯器不同, GNU CC允許結合使用-g'和-O’選項.優化的程式碼偶爾製造 一些驚異的結果:某些宣告過的變數根本不存在;控制流程直接跑到沒有預料到的地方;某些語句因為計算結果是常量或已經確定而 沒有執行;某些語句在其他地方執行,因為他們被移到迴圈外面了.

然而它證明了除錯優化的輸出是可能的.對可能含有錯誤的程式使用優化器是合理的.

如果GNU CC支援輸出多種除錯資訊,下面的選項則非常有用.

-ggdb

以本地格式(如果支援)輸出除錯資訊,儘可能包括GDB擴充套件.

-gstabs

以stabs格式(如果支援)輸出除錯資訊,不包括GDB擴充套件.這是大多數BSD系統上DBX使用的格式.

-gstabs+

以stabs格式(如果支援)輸出除錯資訊,使用只有GNU偵錯程式(GDB)理解的GNU擴充套件.使用這些擴充套件有可能導致 其他偵錯程式崩潰或拒絕讀入程式.

-gcoff

以COFF格式(如果支援)輸出除錯資訊.這是在System V第四版以前的大多數System V系統上SDB使用的 格式.

-gxcoff

以XCOFF格式(如果支援)輸出除錯資訊.這是IBM RS/6000系統上DBX偵錯程式使用的格式.

-gxcoff+

以XCOFF格式(如果支援)輸出除錯資訊,使用只有GNU偵錯程式(GDB)理解的GNU擴充套件.使用這些擴充套件有可能導致 其他偵錯程式崩潰或拒絕讀入程式.

-gdwarf

以DWARF格式(如果支援)輸出除錯資訊.這是大多數System V第四版系統上SDB使用的格式.

-gdwarf+

以DWARF格式(如果支援)輸出除錯資訊,使用只有GNU偵錯程式(GDB)理解的GNU擴充套件.使用這些擴充套件有可能導致 其他偵錯程式崩潰或拒絕讀入程式.

-glevel
-ggdblevel
-gstabslevel
-gcofflevel -gxcofflevel

-gdwarflevel

請求生成除錯資訊,同時用level指出需要多少資訊.預設的level值是2.

Level 1輸出最少量的資訊,僅夠在不打算除錯的程式段內backtrace.包括函式和外部變數的描述,但是 沒有區域性變數和行號資訊.

Level 3包含更多的資訊,如程式中出現的所有巨集定義.當使用`-g3’選項的時候,某些偵錯程式支援 巨集擴充套件.

-p

產生額外程式碼,用於輸出profile資訊,供分析程式prof使用.

-pg

產生額外程式碼,用於輸出profile資訊,供分析程式gprof使用.

-a

產生額外程式碼,用於輸出基本塊(basic block)的profile資訊,它記錄各個基本塊的執行次數,供諸如 tcov此類的程式分析.但是注意,這個資料格式並非tcov期待的.最終GNU gprof 將處理這些資料.

-ax

產生額外程式碼,用於從’bb.in’檔案讀取基本塊的profile引數,把profile的結果寫到’bb.out’ 檔案. bb.in'包含一張函式列表.一旦進入列表中的某個函式, profile操作就開始,離開最外層的函式後, profile操作就結束.以-‘為字首名的函式排除在profile操作之外.如果函式名不是唯一的,它可以寫成 /path/filename.d:functionname'來澄清.bb.out’將列出一些有效的檔名.這四個函式名具有 特殊含義: __bb_jumps__'導致跳轉(jump)頻率寫進bb.out’. __bb_trace__'導致基本塊序列通過 管道傳到gzip’,輸出bbtrace.gz'檔案.bb_hidecall‘導致從跟蹤(trace)中排除call 指令. `bb_showret‘導致在跟蹤中包括返回指令.

-dletters

編譯的時候,在letters指定的時刻做除錯轉儲(dump).用於除錯編譯器.大多數轉儲的檔名 通過原始檔名新增字詞獲得(例如foo.c.rtl'或foo.c.jump’).

-dM

預處理結束的時候轉儲所有的巨集定義,不輸出到檔案.

-dN

預處理結束的時候轉儲所有的巨集名.

-dD

預處理結束的時候轉儲所有的巨集定義,同時進行正常輸出.

-dy

語法分析(parse)的時候在標準錯誤轉儲除錯資訊.

-dr

RTL階段後轉儲到`file.rtl’.

-dx

僅對函式生成RTL,而不是編譯.通常和`r’聯用.

-dj

第一次跳轉優化後轉儲到`file.jump’.

-ds

CSE (包括有時候跟在CSE後面的跳轉優化)後轉儲到`file.cse’.

-dL

迴圈優化後轉儲到`file.loop’.

-dt

第二次CSE處理(包括有時候跟在CSE後面的跳轉優化)後轉儲到`file.cse2’.

-df

流程分析(flow analysis)後轉儲到`file.flow’.

-dc

指令組合(instruction combination)後轉儲到`file.combine’.

-dS

第一次指令安排(instruction schedule)後轉儲到`file.sched’.

-dl

區域性暫存器分配後轉儲到`file.lreg’.

-dg

全域性暫存器分配後轉儲到`file.greg’.

-dR

第二次指令安排(instruction schedule)後轉儲到`file.sched2’.

-dJ

最後一次跳轉優化後轉儲到`file.jump2’.

-dd

推遲分支排程(delayed branch scheduling)後轉儲到`file.dbr’.

-dk

暫存器-堆疊轉換後轉儲到`file.stack’.

-da

產生以上所有的轉儲.

-dm

執行結束後,在標準錯誤顯示記憶體使用統計.

-dp

在彙編輸出加註指明使用了哪些模式(pattern)及其替代模式.

-fpretend-float

交叉編譯的時候,假定目標機和宿主機使用同樣的浮點格式.它導致輸出錯誤的浮點常數,但是在目標機上執行的時候, 真實的指令序列有可能和GNU CC希望的一樣.

-save-temps

儲存那些通常是`臨時''的中間檔案;置於當前目錄下,並且根據原始檔命名.因此,用-c -save-temps’選項編譯foo.c '會生成 foo.cpp’和foo.s' 以及foo.o’檔案.

-print-file-name=library

顯示庫檔案library的全路徑名,連線時會使用這個庫—其他什麼事情都不作.根據這個選項, GNU CC既不編譯,也不連線,僅僅顯示檔名.

-print-libgcc-file-name

和`-print-file-name=libgcc.a’一樣.

-print-prog-name=program

類似於-print-file-name',但是查詢程式program如cpp’.

優化選項(OPTIMIZATION OPTION)

這些選項控制多種優化措施:

-O

-O1

優化.對於大函式,優化編譯佔用稍微多的時間和相當大的記憶體.

不使用`-O’選項時,編譯器的目標是減少編譯的開銷,使編譯結果能夠除錯.語句是獨立的:如果在 兩條語句之間用斷點中止程式,你可以對任何變數重新賦值,或者在函式體內把程式計數器指到其他語句,以及從源程式中 精確地獲取你期待的結果.

不使用-O'選項時,只有聲明瞭register的變數才分配使用暫存器.編譯結果比不用-O’選項的PCC要略遜一籌.

使用了`-O’選項,編譯器會試圖減少目標碼的大小和執行時間.

如果指定了-O'選項,-fthread-jumps’和-fdefer-pop'選項將被 開啟.在有delay slot的機器上,-fdelayed-branch’選項將被開啟.在即使沒有幀指標 (frame pointer)也支援除錯的機器上, `-fomit-frame-pointer’選項將被開啟.某些機器上 還可能會開啟其他選項.

-O2

多優化一些.除了涉及空間和速度交換的優化選項,執行幾乎所有的優化工作.例如不進行迴圈展開(loop unrolling)和函式內嵌(inlining).和-O選項比較,這個選項既增加了編譯時間,也提高了生成程式碼的 執行效果.

-O3

優化的更多.除了開啟-O2所做的一切,它還打開了-finline-functions選項.

-O0

不優化.

如果指定了多個-O選項,不管帶不帶數字,最後一個選項才是生效的選項.

諸如-fflag'此類的選項描述一些機器無關的開關.大多數開關具有肯定和否定兩種格式;-ffoo’開關選項的否定格式應該是-fno-foo'.下面的列表只展示了一種格式---那個不是 預設選項的格式.你可以通過去掉或新增no-‘構造出另一種格式.

-ffloat-store

不要在暫存器中存放浮點變數.這樣可以防止某些機器上不希望的過高精度,如68000的浮點暫存器(來自 68881)儲存的精度超過了double應該具有的精度.

對於大多數程式,過高精度只有好處.但是有些程式嚴格依賴於IEEE浮點數的定義.對這樣的程式可以使用 `-ffloat-store’選項.

-fmemoize-lookups

-fsave-memoized

使用探索法(heuristic)進行更快的編譯(僅對C++).預設情況下不使用探索法.由於探索法只對某些輸入檔案 有效,其他程式的編譯速度會變得更慢.

第一次編譯器必須對成員函式(或對成員資料的引用)建立一個呼叫.它必須(1)判斷出這個類是否實現了那個名字的 成員函式; (2)決定呼叫哪個成員函式(涉及到推測需要做哪種型別轉換); (3)檢查成員函式對呼叫者是否可見.所有這些構成 更慢的編譯.一般情形,第二次對成員函式(或對成員資料的引用)建立的呼叫,必須再次經過相同長度的處理.這意味著象 這樣的程式碼

cout << “This ” << p << ” has ” << n << ” legs.\n”;

對整個三步驟要做六次遍歷.通過使用軟體快取, `命中''能夠顯著地減少這種代價.然而不幸的是,使用這種快取 必須實現其他機制,帶來了它自己的開銷.-fmemoize-lookups’選項開啟軟體快取.

因為函式的正文環境不同,函式對成員和成員函式的訪問權(可見性)也可能不同, g++可能需要重新整理快取. 使用-fmemoize-lookups'選項,每編譯完一個函式就重新整理快取.而-fsave-memoized’選項 也啟用同樣的快取,但是當編譯器發覺最後編譯的函式的正文環境產生的訪問權和下一個待編譯的函式相同,編譯器就 保留快取內容.這對某個類定義許多成員函式時非常有用:除了某些其他類的友函式,每個成員函式擁有和其他成員函式完全一樣 的訪問權,因而無需重新整理快取.

-fno-default-inline

預設為不要把成員函式內嵌,因為它們定義在類的作用域內(僅C++).

-fno-defer-pop

一旦函式返回,引數就立即彈出.對於那些呼叫函式後必須彈出引數的機器,編譯器一般情況下讓幾次函式呼叫的引數 堆積在棧上,然後一次全部彈出.

-fforce-mem

做數學運算前把將要使用的記憶體運算元送入暫存器.通過把記憶體訪問轉換成潛在的公共子表示式,它可能產生較好的目標碼. 如果它們不是公共子表示式,指令組合應該消除各自的暫存器載荷.我樂意傾聽不同意見.

-fforce-addr

做數學運算前把將要使用的記憶體地址常數送入暫存器.它可能和`-fforce-mem’一樣產生較好的 目標碼.我樂意傾聽不同意見.

-fomit-frame-pointer

對於不需要幀指標(frame pointer)的函式,不要在暫存器中儲存幀指標.這樣能夠避免儲存,設定和恢復 幀指標的指令;同時對許多函式提供一個額外的暫存器. 但是在大多數機器上將無法除錯.

某些機器上,如Vax,這個選項無效,因為標準呼叫序列自動處理幀指標,通過假裝不存在而不儲存任何東西.機器描述巨集 FRAME_POINTER_REQUIRED控制目標機是否支援這個選項.

-finline-functions

把所有簡單的函式整合進呼叫者.編譯器探索式地決定哪些函式足夠簡單,值得這種整合.

如果集成了所有給定函式的呼叫,而且函式宣告為static,那麼一般說來GCC有權不按彙編程式碼輸出函式.

-fcaller-saves

允許在暫存器裡分配數值,但是這個方案通常受到各個函式呼叫的衝擊,因此GCC生成額外的程式碼,在函式呼叫的 前後儲存和復原暫存器內容.僅當生成程式碼看上去優於反之結果時才實現這樣的分配.

某些機器上該選項預設為允許,通常這些機器沒有呼叫保護暫存器代替使用.

-fkeep-inline-functions

即使集成了某個函式的所有呼叫,而且該函式宣告為static,仍然輸出這個函式一個獨立的,執行時可呼叫 的版本.

-fno-function-cse

不要把函式地址存入暫存器;讓呼叫固定函式的指令顯式給出函式地址.

這個選項產生效率較低的目標碼,但是如果不用這個選項,某些不尋常的hack,改變彙編器的輸出,可能因優化而帶來 困惑.

-fno-peephole

禁止任何機器相關的peephole優化.

-ffast-math

這個選項出於速度優化,允許GCC違反某些ANSI或IEEE規則/規格.例如,它允許編譯器假設sqrt 函式的引數是非負數.

這個選項不被任何`-O’選項開啟,因為對於嚴格依靠IEEE或ANSI規則/規格實現的數學函式,程式可能 會產生錯誤的結果.

下列選項控制特定的優化. -O2'選項開啟下面的大多數優化項,除了-funroll-loops’和 `-funroll-all-loops’項.

-O'選項通常開啟-fthread-jumps’和`-fdelayed-branch’ 優化項,但是特定的機器上的預設優化項有可能改變.

如果特別情況下非常需要“微調”優化,你可以使用下面的選項.

-fstrength-reduce

執行迴圈強度縮小(loop strength reduction)優化,並且消除重複變數.

-fthread-jumps

執行優化的地點是,如果某個跳轉分支的目的地存在另一個條件比較,而且該條件比較包含在前一個比較語句之內,那麼 執行優化.根據條件是true或者false,前面那條分支重定向到第二條分支的目的地或者緊跟在第二條分支後面.

-funroll-loops

執行迴圈展開(loop unrolling)優化.僅對迴圈次數能夠在編譯時或執行時確定的迴圈實行.

-funroll-all-loops

執行迴圈展開(loop unrolling)優化.對所有迴圈實行.通常使程式執行的更慢.

-fcse-follow-jumps

在公共子表示式消元(common subexpression elimination)的時候,如果沒有其他路徑到達某個跳轉的 目的地,就掃過這條jump指令.例如,如果CSE遇到帶有else從句的if語句,當條件測試為 false時, CSE就跟在jump後面.

-fcse-skip-blocks

它類似於-fcse-follow-jumps'選項,但是CSE跟在條件跳轉後面,條件跳轉跳過了 語句塊(block).如果CSE遇到一條簡單的if語句,不帶else從句,-fcse-skip-blocks’選項將導致CSE跟在if產生的跳轉後面.

-frerun-cse-after-loop

執行迴圈優化後,重新進行公共子表示式消元.

-felide-constructors

如果看上去合理就省略構造子(僅C++).根據這個選項,對於下面的程式碼, GNU C++直接從呼叫foo 初始化y,而無需通過臨時變數:

A foo (); A y = foo ();

如果沒有這個選項, GNU C++首先通過呼叫型別A 合適的構造子初始化y;然後把 foo的結果賦給臨時變數;最後,用臨時變數替換`y’的初始值.

ANSI C++標準草案規定了預設行為(-fno-elide-constructors').如果程式的構造子存在 副效應,-felide-constructors’選項能夠使程式有不同的表現,因為可能忽略一些構造子的呼叫.

-fexpensive-optimizations

執行一些相對開銷較大的次要優化.

-fdelayed-branch

如果對目標機支援這個功能,它試圖重新排列指令,以便利用延遲分支(delayed branch)指令後面的指令空隙.

-fschedule-insns

如果對目標機支援這個功能,它試圖重新排列指令,以便消除因資料未緒造成的執行停頓.這可以幫助浮點運算或記憶體訪問 較慢的機器調取指令,允許其他指令先執行,直到調取指令或浮點運算完成.

-fschedule-insns2

類似於`-fschedule-insns’選項,但是在暫存器分配完成後,需要一個額外的指令排程過程.對於 暫存器數目相對較少,而且取記憶體指令大於一個週期的機器,這個選項特別有用.

目標機選項(TARGET OPTION)

預設情況下, GNU CC編譯出本機型別的目標碼.然而也可以把他安裝成交叉編譯器, 為其他機型編譯程式.事實上,針對不同的目標機,可以同時安裝GNU CC相應的配置.然後用`-b’選項指定 目標機種.

順便提一下,新版本和舊版本的GNU CC可以共存.其中一個版本(可能是最新的那個)為預設版本,但是有時候你希望使用 其他版本.

-b machine

引數machine指出編譯的目標機種.這個選項用於安裝為交叉編譯器的GNU CC.

引數machine的值和配置GNU CC交叉編譯器時設定的機器型別一樣.例如,如果交叉編譯器配置有 configure i386v',意思是編譯80386上的System V目標碼,那麼你可以通過-b i386v’執行交叉編譯器.

如果沒有指定`-b’選項,通常指編譯本機目標碼.

-V version

引數version指出執行哪個版本的GNU CC.這個選項用於安裝了多個版本的GCC.例如,如果 version是`2.0’,意味著執行GNU CC 2.0版.

如果沒有指定`-V’選項,預設版本取決於GNU CC的安裝方式,一般說來推薦使用通用版本.

GCC 4

Section: GNU Tools (1)
Updated: 2003/12/05

機器相關選項(MACHINE DEPENDENT OPTION)

每一種目標機型都有自己的特別選項,這些選項用`-m ‘開關引導,選擇不同的硬體型號或配置—例如, 68010還是68020,有沒有浮點協處理器.通過指定選項,安裝 編譯器的一個版本能夠為所有的型號或配置進行編譯.

此外,編譯器的某些配置支援附加的特殊選項,通常是為了在命令列上相容這個平臺的其他編譯器.

下面是針對68000系列定義的`-m’選項:

-m68000

-mc68000

輸出68000的目標碼.如果編譯器按基於68000的系統配置,這個選項就是預設選項.

-m68020

-mc68020

輸出68020的目標碼(而不是68000).如果編譯器按基於68020的系統配置,這個選項就是預設選項.

-m68881

輸出包含68881浮點指令的目標碼.對於大多數基於68020的系統這是預設選項,除非設定編譯器時指定了 -nfp .

-m68030

輸出68030的目標碼.如果編譯器按基於68030的系統配置,這個選項就是預設選項.

-m68040

輸出68040的目標碼.如果編譯器按基於68040的系統配置,這個選項就是預設選項.

-m68020-40

輸出68040的目標碼,但是不使用新指令.生成的程式碼可以在68020/68881上,也可以在68030或 68040上較有效地執行.

-mfpa

輸出包含SUN FPA浮點指令的目標碼.

-msoft-float

輸出包含浮點庫呼叫的目標碼. 警告:所需的庫不是GNU CC的組成部分.一般說來GCC使用該機型本地C 編譯器的相應部件,但是作交叉編譯時卻不能直接使用.你必須自己管理提供合適的函式庫用於交叉編譯.

-mshort

認為int型別是16位寬,相當於short int.

-mnobitfield

不使用位域(bit-field)指令. -m68000'隱含指定了-mnobitfield’.

-mbitfield

使用位域指令. -m68020'隱含指定了-mbitfield’.如果你使用未改裝的gcc,這就是 預設選項.

-mrtd

採用另一種函式呼叫約定,函式接受固定數目的引數,用rtd指令返回,該指令返回時彈出棧內的引數.這個 方法能夠使呼叫者節省一條指令,因為他這裡不需要彈出引數.

這種呼叫約定不相容UNIX的正常呼叫.因此如果你需要呼叫UNIX編譯器編譯的庫函式,你就不能使用這個選項.

此外,所有引數數量可變地函式必須提供函式原型(包括printf);否則編譯器會生成錯誤的呼叫程式碼.

另外,如果呼叫函式時攜帶了過多的引數,編譯器將生成嚴重錯誤的程式碼. (正常情況下,多餘的引數被安全無害的忽略.)

68010和68020處理器支援rtd指令,但是68000不支援.

下面是針對VAX定義的`-m’選項:

-munix

禁止輸出某些跳轉指令(aobleq等等), VAX的UNIX彙編器無法跨越長範圍(long ranges) 進行處理.

-mgnu

如果使用GNU彙編器,則輸出那些跳轉指令,

-mg

輸出g-format浮點數,取代d-format.

下面是SPARC支援的`-m’選項開關:

-mfpu

-mhard-float

輸出包含浮點指令的目標碼.這是預設選項.

-mno-fpu

-msoft-float

輸出包含浮點庫呼叫的目標碼. 警告:沒有為SPARC提供GNU浮點庫.一般說來使用該機型本地C編譯器 的相應部件,但是不能直接用於交叉編譯.你必須自己安排,提供用於交叉編譯的庫函式.

-msoft-float改變了輸出檔案中的呼叫約定;因此只有用這個選項編譯整個程式才有意義.

-mno-epilogue

-mepilogue

使用-mepilogue (預設)選項時,編譯器總是把函式的退出程式碼放在函式的尾部.任何在函式中間 的退出語句(例如C中的return語句)將產生出跳轉指令指向函式尾部.

使用-mno-epilogue選項時,編譯器儘量在每個函式退出點嵌入退出程式碼.

-mno-v8

-mv8

-msparclite

這三個選項選擇不同種類的SPARC系統.

預設情況下(除非特別為Fujitsu SPARClite配置), GCC生成SPARC v7目標碼.

-mv8生成SPARC v8目標碼.他和v7目標碼唯一的區別是,編譯器生成整數乘法和整數除法指令, SPARC v8支援該指令,而v7體系不支援.

-msparclite生成SPARClite目標碼.增加了SPARClite支援的整數乘法,整數除法單步掃描 (integer divide step and scan (ffs))指令. v7體系不支援這些指令.

-mcypress

-msupersparc

這兩個選項選擇處理器型號,針對處理器進行程式碼優化.

-mcypress選項(預設項)使編譯器對Cypress CY7C602晶片優化程式碼, SparcStation/SparcServer 3xx系列使用這種晶片.該選項也適用於老式的SparcStation 1, 2, IPX 等機型..

-msupersparc選項使編譯器對SuperSparc處理器優化程式碼, SparcStation 10, 1000 和2000系列使用這種晶片.同時該選項啟用完整的SPARC v8指令集.

下面是針對Convex定義的`-m’選項:

-mc1

輸出C1的目標碼.當編譯器對C1配置時,這是預設選項.

-mc2

輸出C2的目標碼.當編譯器對C2配置時,這是預設選項.

-margcount

在每個引數列表的前面放置一個引數計數字(argument count word).某些不可移植的Convex和Vax 程式需要這個引數計數字. (偵錯程式不需要他,除非函式帶有變長引數列表;這個資訊存放在符號表中.)

-mnoargcount

忽略引數計數字.如果你使用未改裝的gcc,這是預設選項.

下面是針對AMD Am29000定義的`-m’選項:

-mdw

生成的目標碼認為DW置位,就是說,位元組和半字操作由硬體直接支援.該選項是預設選項.

-mnodw

生成的目標碼認為DW沒有置位.

-mbw

生成的目標碼認為系統支援位元組和半字寫操作.該選項是預設選項.

-mnbw

生成的目標碼認為系統不支援位元組和半字寫操作.該選項隱含開啟了`-mnodw’選項.

-msmall

使用小記憶體模式,小記憶體模式假設所有函式的地址位於某個256 KB段內,或者所有函式的絕對地址小於256K.這樣 就可以用call指令代替const, consth, calli指令序列.

-mlarge

假設不能使用call指令;這是預設選項.

-m29050

輸出Am29050的目標碼.

-m29000

輸出Am29000的目標碼.這是預設選項.

-mkernel-registers

生成的目標碼引用gr64-gr95暫存器而不是gr96-gr127暫存器.該選項可以用於編譯 核心程式碼,核心需要一組全域性暫存器,這些全域性暫存器和使用者模式使用的暫存器完全無關.

注意,使用這個選項時, `-f’選項中的暫存器名字必須是normal, user-mode, names.

-muser-registers

使用普通全域性暫存器集gr96-gr127.這是預設選項.

-mstack-check

在每次堆疊調整後插入一條__msp_check呼叫.這個選項常用於核心程式碼.

下面是針對Motorola 88K體系定義的`-m’選項:

-m88000

生成的目標碼可以在m88100和m88110上正常工作.

-m88100

生成的目標碼在m88100上工作的最好,但也可以在m88110上執行.