close
普通預先格式化GCC
Section: GNU Tools (1)
Updated: 2003/12/05
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'選項.另外一些預定義巨集,如__unix__和__vax__,無論有沒有使用 `-ansi'選項,始終有效.
使用`-ansi'選項不會自動拒絕編譯非ANSI程式,除非增加`-pedantic'選項作為 `-ansi'選項的補充.
使用`-ansi'選項的時候,預處理器會預定義一個__STRICT_ANSI__巨集.有些頭檔案 關注此巨集,以避免聲明某些函數,或者避免定義某些巨集,這些函數和巨集不被ANSI標準呼叫;這樣就不會干擾在其他地方 使用這些名字的程式了.
-fno-asm
不把asm, inline或typeof當作關鍵字,因此這些 可以用做標識符.用 __asm__, __inline__和__typeof__能夠替代他們. `-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'選項也有相同效果.
篡改字元串常量是一個非常糟糕的想法; ``常量''就應該是常量.
預處理器選項(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 <file>'.
-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 <file>'包含的頭檔案.
如果用`-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
視警告為錯誤;出現任何警告即放棄編譯.
除錯選項(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的安裝模式,一般說來推薦使用通用版本.
機器相關選項(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上營運.
-m88110
生成的目標碼在m88110上工作的最好,可能不能在m88100上營運.
-midentify-revision
在組譯器的輸出端包含一條ident指令,豇錄源檔案名,編譯器名字和版本,時標,以及使用的編譯選項,
-mno-underscores
在組譯器的輸出端,符號名字前面不添加下劃線.默認情況是在每個名字前面增加下劃線前綴.
-mno-check-zero-division
-mcheck-zero-division
早期型號的88K系統在除零操作上存在問題,特定情況下許多機器無法自陷.使用這些選項可以避免包含(或可以 顯明包含)附加的程式碼,這些程式碼能夠檢查除零錯,發送例外信號. GCC所有88K的配置默認使用 `-mcheck-zero-division'選項.
-mocs-debug-info
-mno-ocs-debug-info
包含(或忽略)附加的除錯訊息(關於每個棧架架構中暫存器的使用), 88Open Object Compatibility Standard, ``OCS'',對此訊息做了說明. GDB不需要這些額外訊息. DG/UX, SVr4,和Delta 88 SVr3.2的默認配置是包含除錯訊息,其他88k機型的默認配置是忽略這個訊息.
-mocs-frame-position
-mno-ocs-frame-position
強製(或不要求)把暫存器值存儲到棧架架構中的指定位置(按OCS的說明). DG/UX, Delta88 SVr3.2和 BCS的默認配置使用`-mocs-frame-position'選項;其他88k機型的默認配置是 `-mno-ocs-frame-position'.
-moptimize-arg-area
-mno-optimize-arg-area
控制如何在堆棧架構中存儲函數參數. `-moptimize-arg-area'節省空間,但是有可能宕掉某些 除錯器(不是GDB). `-mno-optimize-arg-area'證實比標準選項好.默認情況下GCC不最佳化參數域.
-mshort-data-
num透過和r0關聯,產生較小的數據引用(data reference),這樣就可以用單指令調入 一個數值(而不是平常的雙指令).用戶透過選項中的num控制改變哪種數據引用.例如,如果你指定了 `-mshort-data-512',那麼受影響的數據引用是小於512位元組的數據移動. -mshort-data-num選項對大於64K的num 無效.
-mserialize-volatile
-mno-serialize-volatile
產生,或不產生程式碼來保證對易變內存 問的結果一致.
對於常用的處理器子型號, GNU CC始終默認保證這種一致性.如何實現結果一致取決於處理器子型號.
m88100處理器不對內存引用重新安排,因此 問結果始終一致.如果使用了`-m88100'選項, GNU CC 不產生任何針對結果一致的特別指令.
m88110處理器的內存引用順序並不始終符合指令請求的引用順序.特別是某條讀取指令可能在先前的存儲指令之前執行. 多處理器環境下,亂序 問擾亂了易變內存
Section: GNU Tools (1)
Updated: 2003/12/05
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'選項.另外一些預定義巨集,如__unix__和__vax__,無論有沒有使用 `-ansi'選項,始終有效.
使用`-ansi'選項不會自動拒絕編譯非ANSI程式,除非增加`-pedantic'選項作為 `-ansi'選項的補充.
使用`-ansi'選項的時候,預處理器會預定義一個__STRICT_ANSI__巨集.有些頭檔案 關注此巨集,以避免聲明某些函數,或者避免定義某些巨集,這些函數和巨集不被ANSI標準呼叫;這樣就不會干擾在其他地方 使用這些名字的程式了.
-fno-asm
不把asm, inline或typeof當作關鍵字,因此這些 可以用做標識符.用 __asm__, __inline__和__typeof__能夠替代他們. `-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'選項也有相同效果.
篡改字元串常量是一個非常糟糕的想法; ``常量''就應該是常量.
預處理器選項(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 <file>'.
-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 <file>'包含的頭檔案.
如果用`-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
視警告為錯誤;出現任何警告即放棄編譯.
除錯選項(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的安裝模式,一般說來推薦使用通用版本.
機器相關選項(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上營運.
-m88110
生成的目標碼在m88110上工作的最好,可能不能在m88100上營運.
-midentify-revision
在組譯器的輸出端包含一條ident指令,豇錄源檔案名,編譯器名字和版本,時標,以及使用的編譯選項,
-mno-underscores
在組譯器的輸出端,符號名字前面不添加下劃線.默認情況是在每個名字前面增加下劃線前綴.
-mno-check-zero-division
-mcheck-zero-division
早期型號的88K系統在除零操作上存在問題,特定情況下許多機器無法自陷.使用這些選項可以避免包含(或可以 顯明包含)附加的程式碼,這些程式碼能夠檢查除零錯,發送例外信號. GCC所有88K的配置默認使用 `-mcheck-zero-division'選項.
-mocs-debug-info
-mno-ocs-debug-info
包含(或忽略)附加的除錯訊息(關於每個棧架架構中暫存器的使用), 88Open Object Compatibility Standard, ``OCS'',對此訊息做了說明. GDB不需要這些額外訊息. DG/UX, SVr4,和Delta 88 SVr3.2的默認配置是包含除錯訊息,其他88k機型的默認配置是忽略這個訊息.
-mocs-frame-position
-mno-ocs-frame-position
強製(或不要求)把暫存器值存儲到棧架架構中的指定位置(按OCS的說明). DG/UX, Delta88 SVr3.2和 BCS的默認配置使用`-mocs-frame-position'選項;其他88k機型的默認配置是 `-mno-ocs-frame-position'.
-moptimize-arg-area
-mno-optimize-arg-area
控制如何在堆棧架構中存儲函數參數. `-moptimize-arg-area'節省空間,但是有可能宕掉某些 除錯器(不是GDB). `-mno-optimize-arg-area'證實比標準選項好.默認情況下GCC不最佳化參數域.
-mshort-data-
num透過和r0關聯,產生較小的數據引用(data reference),這樣就可以用單指令調入 一個數值(而不是平常的雙指令).用戶透過選項中的num控制改變哪種數據引用.例如,如果你指定了 `-mshort-data-512',那麼受影響的數據引用是小於512位元組的數據移動. -mshort-data-num選項對大於64K的num 無效.
-mserialize-volatile
-mno-serialize-volatile
產生,或不產生程式碼來保證對易變內存 問的結果一致.
對於常用的處理器子型號, GNU CC始終默認保證這種一致性.如何實現結果一致取決於處理器子型號.
m88100處理器不對內存引用重新安排,因此 問結果始終一致.如果使用了`-m88100'選項, GNU CC 不產生任何針對結果一致的特別指令.
m88110處理器的內存引用順序並不始終符合指令請求的引用順序.特別是某條讀取指令可能在先前的存儲指令之前執行. 多處理器環境下,亂序 問擾亂了易變內存
全站熱搜
留言列表