GCC
Section: GNU Tools (1)
Updated: 2003/12/05
Index Return to Main Contents
NAME
gcc,g++-GNU工程的C和C++編譯器(egcs-1.1.2)
總覽(SYNOPSIS)
gcc[option|filename ]...
g++[option|filename ]...
警告(WARNING)
本手冊頁內(nèi)容摘自GNU C編譯器的完整文檔,僅限于解釋選項的含義.
除非有人自愿維護(hù),否則本手冊頁不再更新.如果發(fā)現(xiàn)手冊頁和軟件之間有所矛盾,請查對Info文件, Info文件是權(quán)威文檔.
如果我們發(fā)覺本手冊頁的內(nèi)容由于過時而導(dǎo)致明顯的混亂和抱怨時,我們就停止發(fā)布它.不可能有其他選擇,象更新Info文件同時更新man手冊,因?yàn)槠渌S護(hù)GNU CC的工作沒有留給我們時間做這個. GNU工程認(rèn)為man手冊是過時產(chǎn)物,應(yīng)該把時間用到別的地方.
如果需要完整和最新的文檔,請查閱Info文件`gcc’或Using and Porting GNU CC (for version 2.0) (使用和移植GNU CC 2.0) 手冊.二者均來自Texinfo原文件 gcc.texinfo.
描述(DESCRIPTION)
C和C++編譯器是集成的.他們都要用四個步驟中的一個或多個處理輸入文件: 預(yù)處理(preprocessing),編譯(compilation),匯編(assembly)和連接(linking).源文件后綴名標(biāo)識源文件的 語言,但是對編譯器來說,后綴名控制著缺省設(shè)定:
gcc
認(rèn)為預(yù)處理后的文件(.i)是C文件,并且設(shè)定C形式的連接.
g++
認(rèn)為預(yù)處理后的文件(.i)是C++文件,并且設(shè)定C++形式的連接.
源文件后綴名指出語言種類以及后期的操作:
.c C源程序;預(yù)處理,編譯,匯編
.C C++源程序;預(yù)處理,編譯,匯編
.cc C++源程序;預(yù)處理,編譯,匯編
.cxx C++源程序;預(yù)處理,編譯,匯編
.m Objective-C源程序;預(yù)處理,編譯,匯編
.i 預(yù)處理后的C文件;編譯,匯編
.ii 預(yù)處理后的C++文件;編譯,匯編
.s 匯編語言源程序;匯編
.S 匯編語言源程序;預(yù)處理,匯編
.h 預(yù)處理器文件;通常不出現(xiàn)在命令行上
其他后綴名的文件被傳遞給連接器(linker).通常包括:
.o 目標(biāo)文件(Object file)
.a 歸檔庫文件(Archive file)
除非使用了-c, -S,或-E選項(或者編譯錯誤阻止了完整的過程),否則連接總是 最后的步驟.在連接階段中,所有對應(yīng)于源程序的.o文件, -l庫文件,無法識別的文件名(包括指定的 .o目標(biāo)文件和.a庫文件)按命令行中的順序傳遞給連接器.
選項(OPTIONS)
選項必須分立給出: `-dr’完全不同于`-d -r ’.
大多數(shù)`-f’和`-W’選項有兩個相反的格式: -fname和 -fno-name (或-Wname和-Wno-name).這里 只列舉不是默認(rèn)選項的格式.
下面是所有選項的摘要,按類型分組,解釋放在后面的章節(jié)中.
總體選項(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
調(diào)試選項(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
優(yōu)化選項(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
預(yù)處理器選項(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
目標(biāo)機(jī)選項(Target Option)
-b machine -V version
配置相關(guān)選項(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 (而不是從文件名后綴得到的默認(rèn)選擇).這個選項應(yīng)用于后面 所有的輸入文件,直到遇著下一個`-x’選項. language的可選值有`c’, `objective-c’, `c-header’, `c++’, `cpp-output’, `assembler’,和`assembler-with-cpp’.
-x none
關(guān)閉任何對語種的明確說明,因此依據(jù)文件名后綴處理后面的文件(就象是從未使用過`-x’選項).
如果只操作四個階段(預(yù)處理,編譯,匯編,連接)中的一部分,可以使用`-x’選項(或文件名后綴)告訴 gcc從哪里開始,用`-c’, `-S’,或`-E’選項告訴gcc到 哪里結(jié)束.注意,某些選項組合(例如, `-x cpp-output -E’)使gcc不作任何事情.
-c
編譯或匯編源文件,但是不作連接.編譯器輸出對應(yīng)于源文件的目標(biāo)文件.
缺省情況下, GCC通過用`.o’替換源文件名后綴`.c’, `.i’, `.s’,等等,產(chǎn)生目標(biāo)文件名.可以使用-o選項選擇其他名字.
GCC忽略-c選項后面任何無法識別的輸入文件(他們不需要編譯或匯編).
-S
編譯后即停止,不進(jìn)行匯編.對于每個輸入的非匯編語言文件,輸出文件是匯編語言文件.
缺省情況下, GCC通過用`.o’替換源文件名后綴`.c’, `.i’,等等,產(chǎn)生 目標(biāo)文件名.可以使用-o選項選擇其他名字.
GCC忽略任何不需要編譯的輸入文件.
-E
預(yù)處理后即停止,不進(jìn)行編譯.預(yù)處理后的代碼送往標(biāo)準(zhǔn)輸出.
GCC忽略任何不需要預(yù)處理的輸入文件.
-o file
指定輸出文件為file.該選項不在乎GCC產(chǎn)生什么輸出,無論是可執(zhí)行文件,目標(biāo)文件,匯編文件還是 預(yù)處理后的C代碼.
由于只能指定一個輸出文件,因此編譯多個輸入文件時,使用`-o’選項沒有意義,除非輸出一個可執(zhí)行文件.
如果沒有使用`-o’選項,默認(rèn)的輸出結(jié)果是:可執(zhí)行文件為`a.out’, `source.suffix ’的目標(biāo)文件是`source.o’,匯編文件是 `source.s’,而預(yù)處理后的C源代碼送往標(biāo)準(zhǔn)輸出.
-v
(在標(biāo)準(zhǔn)錯誤)顯示執(zhí)行編譯階段的命令.同時顯示編譯器驅(qū)動程序,預(yù)處理器,編譯器的版本號.
-pipe
在編譯過程的不同階段間使用管道而非臨時文件進(jìn)行通信.這個選項在某些系統(tǒng)上無法工作,因?yàn)槟切┫到y(tǒng)的 匯編器不能從管道讀取數(shù)據(jù). GNU的匯編器沒有這個問題.
語言選項(LANGUAGE OPTIONS)
下列選項控制編譯器能夠接受的C "方言":
-ansi
支持符合ANSI標(biāo)準(zhǔn)的C程序.
這樣就會關(guān)閉GNU C中某些不兼容ANSI C的特性,例如asm, inline和 typeof關(guān)鍵字,以及諸如unix和vax這些表明當(dāng)前系統(tǒng)類型的預(yù)定義宏.同時開啟 不受歡迎和極少使用的ANSI trigraph特性,以及禁止`$’成為標(biāo)識符的一部分.
盡管使用了`-ansi’選項,下面這些可選的關(guān)鍵字, __asm__, __extension__, __inline__和__typeof__仍然有效.你當(dāng)然不會把 他們用在ANSI C程序中,但可以把他們放在頭文件里,因?yàn)榫幾g包含這些頭文件的程序時,可能會指定 `-ansi’選項.另外一些預(yù)定義宏,如__unix__和__vax__,無論有沒有使用 `-ansi’選項,始終有效.
使用`-ansi’選項不會自動拒絕編譯非ANSI程序,除非增加`-pedantic’選項作為 `-ansi’選項的補(bǔ)充.
使用`-ansi’選項的時候,預(yù)處理器會預(yù)定義一個__STRICT_ANSI__宏.有些頭文件 關(guān)注此宏,以避免聲明某些函數(shù),或者避免定義某些宏,這些函數(shù)和宏不被ANSI標(biāo)準(zhǔn)調(diào)用;這樣就不會干擾在其他地方 使用這些名字的程序了.
-fno-asm
不把a(bǔ)sm, inline或typeof當(dāng)作關(guān)鍵字,因此這些詞可以用做標(biāo)識符.用 __asm__, __inline__和__typeof__能夠替代他們. `-ansi’ 隱含聲明了`-fno-asm’.
-fno-builtin
不接受不是兩個下劃線開頭的內(nèi)建函數(shù)(built-in function).目前受影響的函數(shù)有_exit, abort, abs, alloca, cos, exit, fabs, labs, memcmp, memcpy, sin, sqrt, strcmp, strcpy,和strlen.
`-ansi’選項能夠阻止alloca和_exit成為內(nèi)建函數(shù).
-fhosted
按宿主環(huán)境編譯;他隱含聲明了`-fbuiltin’選項,而且警告不正確的main函數(shù)聲明.
-ffreestanding
按獨(dú)立環(huán)境編譯;他隱含聲明了`-fno-builtin’選項,而且對main函數(shù)沒有特別要求.
(譯注:宿主環(huán)境(hosted environment)下所有的標(biāo)準(zhǔn)庫可用, main函數(shù)返回一個int值,典型例子是除了 內(nèi)核以外幾乎所有的程序.對應(yīng)的獨(dú)立環(huán)境(freestanding environment)不存在標(biāo)準(zhǔn)庫,程序入口也不一定是 main,最明顯的例子就是操作系統(tǒng)內(nèi)核.詳情參考gcc網(wǎng)站最近的資料)
-fno-strict-prototype
對于沒有參數(shù)的函數(shù)聲明,例如`int foo ();’,按C風(fēng)格處理---即不說明參數(shù)個數(shù)或類型. (僅針對C++).正常情況下,這樣的函數(shù)foo在C++中意味著參數(shù)為空.
-trigraphs
支持ANSI C trigraphs. `-ansi’選項隱含聲明了`-trigraphs’.
-traditional
試圖支持傳統(tǒng)C編譯器的某些方面.詳見GNU C手冊,我們已經(jīng)把細(xì)節(jié)清單從這里刪除,這樣當(dāng)內(nèi)容過時后,人們也不會 埋怨我們.
除了一件事:對于C++程序(不是C), `-traditional’選項帶來一個附加效應(yīng),允許對 this賦值.他和`-fthis-is-variable’選項的效果一樣.
-traditional-cpp
試圖支持傳統(tǒng)C預(yù)處理器的某些方面.特別是上面提到有關(guān)預(yù)處理器的內(nèi)容,但是不包括 `-traditional’選項的其他效應(yīng).
-fdollars-in-identifiers
允許在標(biāo)識符(identifier)中使用`$’字符(僅針對C++).你可以指定 `-fno-dollars-in-identifiers’選項顯明禁止使用`$’符. (GNU C++在某些 目標(biāo)系統(tǒng)缺省允許`$’符,但不是所有系統(tǒng).)
-fenum-int-equiv
允許int類型到枚舉類型(enumeration)的隱式轉(zhuǎn)換(僅限于C++).正常情況下GNU C++允許從 enum到int的轉(zhuǎn)換,反之則不行.
-fexternal-templates
為模板聲明(template declaration)產(chǎn)生較小的代碼(僅限于C++),方法是對于每個模板函數(shù) (template function),只在定義他們的地方生成一個副本.想要成功使用這個選項,你必須在所有使用模板的 文件中,標(biāo)記`#pragma implementation’ (定義)或`#pragma interface’ (聲明).
當(dāng)程序用`-fexternal-templates’編譯時,模板實(shí)例(template instantiation) 全部是外部類型.你必須讓需要的實(shí)例在實(shí)現(xiàn)文件中出現(xiàn).可以通過typedef實(shí)現(xiàn)這一點(diǎn),他引用所需的每個 實(shí)例.相對應(yīng)的,如果編譯時使用缺省選項`-fno-external-templates’,所有模板實(shí)例明確的設(shè)為內(nèi)置.
-fall-virtual
所有可能的成員函數(shù)默認(rèn)為虛函數(shù).所有的成員函數(shù)(除了構(gòu)造子函數(shù)和new或delete 成員操作符)視為所在類的虛函數(shù).
這不表明每次調(diào)用成員函數(shù)都將通過內(nèi)部虛函數(shù)表.有些情況下,編譯器能夠判斷出可以直接調(diào)用某個虛函數(shù);這時就 直接調(diào)用.
-fcond-mismatch
允許條件表達(dá)式的第二和第三個參數(shù)的類型不匹配.這種表達(dá)式的值是void.
-fthis-is-variable
允許對this賦值(僅對C++).合并用戶自定義的自由存儲管理機(jī)制到C++后,使可賦值的 `this’顯得不合時宜.因此,默認(rèn)情況下,類成員函數(shù)內(nèi)部對this賦值是無效操作.然而為了 向后兼容,你可以通過`-fthis-is-variable’選項使這種操作有效.
-funsigned-char
把char定義為無符號類型,如同unsigned char.
各種機(jī)器都有自己缺省的char類型.既可能是unsigned char也可能是signed char .
理想情況下,當(dāng)依賴于數(shù)據(jù)的符號性時,一個可移植程序總是應(yīng)該使用signed char或unsigned char.但是許多程序已經(jīng)寫成只用簡單的char,并且期待這是有符號數(shù)(或者無符號數(shù),具體情況取決于 編寫程序的目標(biāo)機(jī)器).這個選項,和它的反義選項,使那樣的程序工作在對應(yīng)的默認(rèn)值上.
char的類型始終應(yīng)該明確定義為signed char或unsigned char,即使 它表現(xiàn)的和其中之一完全一樣.
-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)或無符號位域.缺省情況下,位域是有符號的,因?yàn)樗麄兝^承的基本整數(shù)類型,如int,是 有符號數(shù).
然而,如果指定了`-traditional’選項,位域永遠(yuǎn)是無符號數(shù).
-fwritable-strings
把字符串常量存儲到可寫數(shù)據(jù)段,而且不做特別對待.這是為了兼容一些老程序,他們假設(shè)字符串常量是可寫的. `-traditional’選項也有相同效果.
篡改字符串常量是一個非常糟糕的想法; ``常量’’就應(yīng)該是常量.
預(yù)處理器選項(Preprocessor Option)
下列選項針對C預(yù)處理器,預(yù)處理器用在正式編譯以前,對C 源文件進(jìn)行某種處理.
如果指定了`-E’選項, GCC只進(jìn)行預(yù)處理工作.下面的某些選項必須和`-E’選項一起才 有意義,因?yàn)樗麄兊妮敵鼋Y(jié)果不能用于編譯.
-include file
在處理常規(guī)輸入文件之前,首先處理文件file,其結(jié)果是,文件file的內(nèi)容先得到編譯. 命令行上任何`-D’和`-U’選項永遠(yuǎn)在`-include file’之前處理, 無論他們在命令行上的順序如何.然而`-include’和`-imacros’選項按書寫順序處理.
-imacros file
在處理常規(guī)輸入文件之前,首先處理文件file,但是忽略輸出結(jié)果.由于丟棄了文件file的 輸出內(nèi)容, `-imacros file’選項的唯一效果就是使文件file中的宏定義生效, 可以用于其他輸入文件.在處理`-imacrosfile’選項之前,預(yù)處理器首先處理`-D’ 和`-U’選項,并不在乎他們在命令行上的順序.然而`-include’和 `-imacros’選項按書寫順序處理.
-idirafter dir
把目錄dir添加到第二包含路徑中.如果某個頭文件在主包含路徑(用`-I’添加的路徑)中沒有 找到,預(yù)處理器就搜索第二包含路徑.
-iprefix prefix
指定prefix作為后續(xù)`-iwithprefix’選項的前綴.
-iwithprefix dir
把目錄添加到第二包含路徑中.目錄名由prefix和dir合并而成,這里 prefix被先前的`-iprefix’選項指定.
-nostdinc
不要在標(biāo)準(zhǔn)系統(tǒng)目錄中尋找頭文件.只搜索`-I’選項指定的目錄(以及當(dāng)前目錄,如果合適).
結(jié)合使用`-nostdinc’和`-I-’選項,你可以把包含文件搜索限制在顯式指定的目錄.
-nostdinc++
不要在C++專用標(biāo)準(zhǔn)目錄中尋找頭文件,但是仍然搜索其他標(biāo)準(zhǔn)目錄. (當(dāng)建立`libg++’時使用 這個選項.)
-undef
不要預(yù)定義任何非標(biāo)準(zhǔn)宏. (包括系統(tǒng)結(jié)構(gòu)標(biāo)志).
-E
僅運(yùn)行C預(yù)處理器.預(yù)處理所有指定的C源文件,結(jié)果送往標(biāo)準(zhǔn)輸出或指定的輸出文件.
-C
告訴預(yù)處理器不要丟棄注釋.配合`-E’選項使用.
-P
告訴預(yù)處理器不要產(chǎn)生`#line’命令.配合`-E’選項使用.
-M [ -MG ]
告訴預(yù)處理器輸出一個適合make的規(guī)則,用于描述各目標(biāo)文件的依賴關(guān)系.對于每個源文件,預(yù)處理器輸出 一個make規(guī)則,該規(guī)則的目標(biāo)項(target)是源文件對應(yīng)的目標(biāo)文件名,依賴項(dependency)是源文件中 `#include引用的所有文件.生成的規(guī)則可以是單行,但如果太長,就用`’-換行符續(xù)成多行.規(guī)則 顯示在標(biāo)準(zhǔn)輸出,不產(chǎn)生預(yù)處理過的C程序.
`-M’隱含了`-E’選項.
`-MG’要求把缺失的頭文件按存在對待,并且假定他們和源程序文件在同一目錄下.必須和 `-M’選項一起用.
-MM [ -MG ]
和`-M’選項類似,但是輸出結(jié)果僅涉及用戶頭文件,象這樣`#include file"’.忽略系統(tǒng)頭文件如`#include
-MD
和`-M’選項類似,但是把依賴信息輸出在文件中,文件名通過把輸出文件名末尾的`.o’替換為 `.d’產(chǎn)生.同時繼續(xù)指定的編譯工作---`-MD’不象`-M’那樣阻止正常的編譯任務(wù).
Mach的實(shí)用工具`md’能夠合并`.d’文件,產(chǎn)生適用于`make’命令的單一的 依賴文件.
-MMD
和`-MD’選項類似,但是輸出結(jié)果僅涉及用戶頭文件,忽略系統(tǒng)頭文件.
-H
除了其他普通的操作, GCC顯示引用過的頭文件名.
-Aquestion(answer)
如果預(yù)處理器做條件測試,如`#if #question(answer)’,該選項可以斷言(Assert) question的答案是answer. -A-’關(guān)閉一般用于描述目標(biāo)機(jī)的標(biāo)準(zhǔn)斷言.
-Dmacro
定義宏macro,宏的內(nèi)容定義為字符串`1’.
-Dmacro=defn
定義宏macro的內(nèi)容為defn.命令行上所有的`-D’選項在 `-U’選項之前處理.
-Umacro
取消宏macro. `-U’選項在所有的`-D’選項之后處理,但是優(yōu)先于任何 `-include’或`-imacros’選項.
-dM
告訴預(yù)處理器輸出有效的宏定義列表(預(yù)處理結(jié)束時仍然有效的宏定義).該選項需結(jié)合`-E’選項使用.
-dD
告訴預(yù)處理器把所有的宏定義傳遞到輸出端,按照出現(xiàn)的順序顯示.
-dN
和`-dD’選項類似,但是忽略宏的參量或內(nèi)容.只在輸出端顯示`#define name.
匯編器選項(ASSEMBLER OPTION)
-Wa,option
把選項option傳遞給匯編器.如果option含有逗號,就在逗號處分割成多個選項.
連接器選項(LINKER OPTION)
下面的選項用于編譯器連接目標(biāo)文件,輸出可執(zhí)行文件的時候.如果編譯器不進(jìn)行 連接,他們就毫無意義.
object-file-name
如果某些文件沒有特別明確的后綴a special recognized suffix, GCC就認(rèn)為他們是目標(biāo)文件或庫文件. (根據(jù)文件內(nèi)容,連接器能夠區(qū)分目標(biāo)文件和庫文件).如果GCC執(zhí)行連接操作,這些目標(biāo)文件將成為連接器的輸入文件.
-llibrary
連接名為library的庫文件.
連接器在標(biāo)準(zhǔn)搜索目錄中尋找這個庫文件,庫文件的真正名字是`liblibrary.a’.連接器會 當(dāng)做文件名得到準(zhǔn)確說明一樣引用這個文件.
搜索目錄除了一些系統(tǒng)標(biāo)準(zhǔn)目錄外,還包括用戶以`-L’選項指定的路徑.
一般說來用這個方法找到的文件是庫文件---即由目標(biāo)文件組成的歸檔文件(archive file).連接器處理歸檔文件的 方法是:掃描歸檔文件,尋找某些成員,這些成員的符號目前已被引用,不過還沒有被定義.但是,如果連接器找到普通的 目標(biāo)文件,而不是庫文件,就把這個目標(biāo)文件按平常方式連接進(jìn)來.指定`-l’選項和指定文件名的唯一區(qū)別是, `-l選項用`lib’和`.a’把library包裹起來,而且搜索一些目錄.
-lobjc
這個-l選項的特殊形式用于連接Objective C程序.
-nostartfiles
不連接系統(tǒng)標(biāo)準(zhǔn)啟動文件,而標(biāo)準(zhǔn)庫文件仍然正常使用.
-nostdlib
不連接系統(tǒng)標(biāo)準(zhǔn)啟動文件和標(biāo)準(zhǔn)庫文件.只把指定的文件傳遞給連接器.
-static
在支持動態(tài)連接(dynamic linking)的系統(tǒng)上,阻止連接共享庫.該選項在其他系統(tǒng)上無效.
-shared
生成一個共享目標(biāo)文件,他可以和其他目標(biāo)文件連接產(chǎn)生可執(zhí)行文件.只有部分系統(tǒng)支持該選項.
-symbolic
建立共享目標(biāo)文件的時候,把引用綁定到全局符號上.對所有無法解析的引用作出警告(除非用連接編輯選項 `-Xlinker -z -Xlinker defs’取代).只有部分系統(tǒng)支持該選項.
-Xlinker option
把選項option傳遞給連接器.可以用他傳遞系統(tǒng)特定的連接選項, GNU CC無法識別這些選項.
如果需要傳遞攜帶參數(shù)的選項,你必須使用兩次`-Xlinker’,一次傳遞選項,另一次傳遞他的參數(shù). 例如,如果傳遞`-assert definitions’,你必須寫成`-Xlinker -assert -Xlinker definitions’,而不能寫成`-Xlinker "-assert definitions"’,因?yàn)檫@樣會把整個 字符串當(dāng)做一個參數(shù)傳遞,顯然這不是連接器期待的.
-Wl,option
把選項option傳遞給連接器.如果option中含有逗號,就在逗號處分割成多個選項.
-u symbol
使連接器認(rèn)為取消了symbol的符號定義,從而連接庫模塊以取得定義.你可以使用多個 `-u’選項,各自跟上不同的符號,使得連接器調(diào)入附加的庫模塊.
目錄選項(DIRECTORY OPTION)
下列選項指定搜索路徑,用于查找頭文件,庫文件,或編譯器的某些成員:
-Idir
在頭文件的搜索路徑列表中添加dir 目錄.
-I-
任何在`-I-’前面用`-I’選項指定的搜索路徑只適用于`#include "file"’這種情況;他們不能用來搜索`#include
如果用`-I’選項指定的搜索路徑位于`-I-’選項后面,就可以在這些路徑中搜索所有的 `#include’指令. (一般說來-I選項就是這么用的.)
還有, `-I-’選項能夠阻止當(dāng)前目錄(存放當(dāng)前輸入文件的地方)成為搜索`#include "file"’的第一選擇.沒有辦法克服`-I-’選項的這個效應(yīng).你可以指定 `-I.’搜索那個目錄,它在調(diào)用編譯器時是當(dāng)前目錄.這和預(yù)處理器的默認(rèn)行為不完全一樣,但是結(jié)果通常 令人滿意.
`-I-’不影響使用系統(tǒng)標(biāo)準(zhǔn)目錄,因此, `-I-’和`-nostdinc’是不同的選項.
-Ldir
在`-l’選項的搜索路徑列表中添加dir目錄.
-Bprefix
這個選項指出在何處尋找可執(zhí)行文件,庫文件,以及編譯器自己的數(shù)據(jù)文件.
編譯器驅(qū)動程序需要執(zhí)行某些下面的子程序: `cpp’, `cc1’ (或C++的 `cc1plus’), `as’和`ld’.他把prefix當(dāng)作欲執(zhí)行的程序的 前綴,既可以包括也可以不包括`machine/version/’.
對于要運(yùn)行的子程序,編譯器驅(qū)動程序首先試著加上`-B’前綴(如果存在).如果沒有找到文件,或沒有指定 `-B’選項,編譯器接著會試驗(yàn)兩個標(biāo)準(zhǔn)前綴`/usr/lib/gcc/’和 `/usr/local/lib/gcc-lib/’.如果仍然沒能夠找到所需文件,編譯器就在`PATH’環(huán)境變量 指定的路徑中尋找沒加任何前綴的文件名.
如果有需要,運(yùn)行時(run-time)支持文件`libgcc.a’也在`-B’前綴的搜索范圍之內(nèi). 如果這里沒有找到,就在上面提到的兩個標(biāo)準(zhǔn)前綴中尋找,僅此而已.如果上述方法沒有找到這個文件,就不連接他了.多數(shù) 情況的多數(shù)機(jī)器上, `libgcc.a’并非必不可少.
你可以通過環(huán)境變量GCC_EXEC_PREFIX獲得近似的效果;如果定義了這個變量,其值就和上面說的 一樣用做前綴.如果同時指定了`-B’選項和GCC_EXEC_PREFIX變量,編譯器首先使用 `-B’選項,然后才嘗試環(huán)境變量值.
警告選項(WARNING OPTION)
警告是針對程序結(jié)構(gòu)的診斷信息,程序不一定有錯誤,而是存在風(fēng)險,或者可能存在 錯誤.
下列選項控制GNU CC產(chǎn)生的警告的數(shù)量和類型:
-fsyntax-only
檢查程序中的語法錯誤,但是不產(chǎn)生輸出信息.
-w
禁止所有警告信息.
-Wno-import
禁止所有關(guān)于#import的警告信息.
-pedantic
打開完全服從ANSI C標(biāo)準(zhǔn)所需的全部警告診斷;拒絕接受采用了被禁止的語法擴(kuò)展的程序.
無論有沒有這個選項,符合ANSI C標(biāo)準(zhǔn)的程序應(yīng)該能夠被正確編譯(雖然極少數(shù)程序需要`-ansi’ 選項).然而,如果沒有這個選項,某些GNU擴(kuò)展和傳統(tǒng)C特性也得到支持.使用這個選項可以拒絕這些程序.沒有理由 使用這個選項,他存在只是為了滿足一些書呆子(pedant).
對于替選關(guān)鍵字(他們以`__’開始和結(jié)束) `-pedantic’不會產(chǎn)生警告信息. Pedantic 也不警告跟在__extension__后面的表達(dá)式.不過只應(yīng)該在系統(tǒng)頭文件中使用這種轉(zhuǎn)義措施,應(yīng)用程序最好 避免.
-pedantic-errors
該選項和`-pedantic’類似,但是顯示錯誤而不是警告.
-W
對下列事件顯示額外的警告信息:
*
非易變自動變量(nonvolatile automatic variable)可能在調(diào)用longjmp時發(fā)生改變. 這些警告僅在優(yōu)化編譯時發(fā)生.
編譯器只知道對setjmp的調(diào)用,他不可能知道會在哪里調(diào)用longjmp,事實(shí)上一個 信號處理例程可以在程序的任何地點(diǎn)調(diào)用他.其結(jié)果是,即使程序沒有問題,你也可能會得到警告,因?yàn)闊o法在可能出現(xiàn)問題 的地方調(diào)用longjmp.
*
既可以返回值,也可以不返回值的函數(shù). (缺少結(jié)尾的函數(shù)體被看作不返回函數(shù)值)例如,下面的函數(shù)將導(dǎo)致這種警告:
foo (a)
{
if (a > 0)
return a;
}
由于GNU CC不知道某些函數(shù)永不返回(含有abort和longjmp),因此有可能出現(xiàn) 虛假警告.
*
表達(dá)式語句或逗號表達(dá)式的左側(cè)沒有產(chǎn)生作用(side effect).如果要防止這種警告,應(yīng)該把未使用的表達(dá)式強(qiáng)制轉(zhuǎn)換 為void類型.例如,這樣的表達(dá)式`x[i,j]’會導(dǎo)致警告,而`x[(void)i,j]’就不會.
*
無符號數(shù)用`>’或`<=’和零做比較.
-Wimplicit-int
警告沒有指定類型的聲明.
-Wimplicit-function-declaration
警告在聲明之前就使用的函數(shù).
-Wimplicit
同-Wimplicit-int和-Wimplicit-function-declaration.
-Wmain
如果把main函數(shù)聲明或定義成奇怪的類型,編譯器就發(fā)出警告.典型情況下,這個函數(shù)用于外部連接, 返回int數(shù)值,不需要參數(shù),或指定兩個參數(shù).
-Wreturn-type
如果函數(shù)定義了返回類型,而默認(rèn)類型是int型,編譯器就發(fā)出警告.同時警告那些不帶返回值的 return語句,如果他們所屬的函數(shù)并非void類型.
-Wunused
如果某個局部變量除了聲明就沒再使用,或者聲明了靜態(tài)函數(shù)但是沒有定義,或者某條語句的運(yùn)算結(jié)果顯然沒有使用, 編譯器就發(fā)出警告.
-Wswitch
如果某條switch語句的參數(shù)屬于枚舉類型,但是沒有對應(yīng)的case語句使用枚舉元素,編譯器 就發(fā)出警告. ( default語句的出現(xiàn)能夠防止這個警告.)超出枚舉范圍的case語句同樣會 導(dǎo)致這個警告.
-Wcomment
如果注釋起始序列`/*’出現(xiàn)在注釋中,編譯器就發(fā)出警告.
-Wtrigraphs
警告任何出現(xiàn)的trigraph (假設(shè)允許使用他們).
-Wformat
檢查對printf和scanf等函數(shù)的調(diào)用,確認(rèn)各個參數(shù)類型和格式串中的一致.
-Wchar-subscripts
警告類型是char的數(shù)組下標(biāo).這是常見錯誤,程序員經(jīng)常忘記在某些機(jī)器上char有符號.
-Wuninitialized
在初始化之前就使用自動變量.
這些警告只可能做優(yōu)化編譯時出現(xiàn),因?yàn)樗麄冃枰獢?shù)據(jù)流信息,只有做優(yōu)化的時候才估算數(shù)據(jù)流信息.如果不指定 `-O’選項,就不會出現(xiàn)這些警告.
這些警告僅針對等候分配寄存器的變量.因此不會發(fā)生在聲明為volatile的變量上面,不會發(fā)生在已經(jīng) 取得地址的變量,或長度不等于1, 2, 4, 8字節(jié)的變量.同樣也不會發(fā)生在結(jié)構(gòu),聯(lián)合或數(shù)組上面,即使他們在 寄存器中.
注意,如果某個變量只計算了一個從未使用過的值,這里可能不會警告.因?yàn)樵陲@示警告之前,這樣的計算已經(jīng)被 數(shù)據(jù)流分析刪除了.
這些警告作為可選項是因?yàn)镚NU CC還沒有智能到判別所有的情況,知道有些看上去錯誤的代碼其實(shí)是正確的.下面是 一個這樣的例子:
{
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不知道這一點(diǎn).下面是 另一個普遍案例:
{
int save_y;
if (change_y) save_y = y, y = new_y;
...
if (change_y) y = save_y;
}
這里沒有錯誤,因?yàn)橹挥性O(shè)置了save_y才使用他.
把所有不返回的函數(shù)定義為volatile可以避免某些似是而非的警告.
[dvnews_page=GCC 中文手冊(中)]
-Wparentheses
在某些情況下如果忽略了括號,編譯器就發(fā)出警告.
-Wtemplate-debugging
當(dāng)在C++程序中使用template的時候,如果調(diào)試(debugging)沒有完全生效,編譯器就發(fā)出警告. (僅用于C++).
-Wall
結(jié)合所有上述的`-W'選項.通常我們建議避免這些被警告的用法,我們相信,恰當(dāng)結(jié)合宏的使用能夠 輕易避免這些用法。
剩下的`-W...'選項不包括在`-Wall'中,因?yàn)槲覀冋J(rèn)為在必要情況下,這些被編譯器警告 的程序結(jié)構(gòu),可以合理的用在"干凈的"程序中.
-Wtraditional
如果某些程序結(jié)構(gòu)在傳統(tǒng)C中的表現(xiàn)和ANSI C不同,編譯器就發(fā)出警告.
*
宏參出現(xiàn)在宏體的字符串常量內(nèi)部.傳統(tǒng)C會替換宏參,而ANSI C則視其為常量的一部分.
*
某個函數(shù)在塊(block)中聲明為外部,但在塊結(jié)束后才調(diào)用.
*
switch語句的操作數(shù)類型是long.
-Wshadow
一旦某個局部變量屏蔽了另一個局部變量,編譯器就發(fā)出警告.
-Wid-clash-len
一旦兩個確定的標(biāo)識符具有相同的前l(fā)en個字符,編譯器就發(fā)出警告.他可以協(xié)助你開發(fā)一些將要在某些 過時的,危害大腦的編譯器上編譯的程序.
-Wpointer-arith
任何語句如果依賴于函數(shù)類型的大小(size)或者void類型的大小,編譯器就發(fā)出警告. GNU C為了 便于計算void *指針和函數(shù)指針,就把這些類型的大小定義為1.
-Wcast-qual
一旦某個指針強(qiáng)制類型轉(zhuǎn)換以便移除類型修飾符時,編譯器就發(fā)出警告.例如,如果把const char * 強(qiáng)制轉(zhuǎn)換為普通的char *時,警告就會出現(xiàn).
-Wcast-align
一旦某個指針類型強(qiáng)制轉(zhuǎn)換時,導(dǎo)致目標(biāo)所需的地址對齊(alignment)增加,編譯器就發(fā)出警告.例如,某些機(jī)器上 只能在2或4字節(jié)邊界上訪問整數(shù),如果在這種機(jī)型上把char *強(qiáng)制轉(zhuǎn)換成int *類型, 編譯器就發(fā)出警告.
-Wwrite-strings
規(guī)定字符串常量的類型是const char[length],因此,把這樣的地址復(fù)制給 non-const char *指針將產(chǎn)生警告.這些警告能夠幫助你在編譯期間發(fā)現(xiàn)企圖寫入字符串常量 的代碼,但是你必須非常仔細(xì)的在聲明和原形中使用const,否則他們只能帶來麻煩;所以我們沒有讓 `-Wall'提供這些警告.
-Wconversion
如果某函數(shù)原形導(dǎo)致的類型轉(zhuǎn)換和無函數(shù)原形時的類型轉(zhuǎn)換不同,編譯器就發(fā)出警告.這里包括定點(diǎn)數(shù)和浮點(diǎn)數(shù)的 互相轉(zhuǎn)換,改變定點(diǎn)數(shù)的寬度或符號,除非他們和缺省聲明(default promotion)相同.
-Waggregate-return
如果定義或調(diào)用了返回結(jié)構(gòu)或聯(lián)合的函數(shù),編譯器就發(fā)出警告. (從語言角度你可以返回一個數(shù)組,然而同樣會 導(dǎo)致警告.)
-Wstrict-prototypes
如果函數(shù)的聲明或定義沒有指出參數(shù)類型,編譯器就發(fā)出警告. (如果函數(shù)的前向引用說明指出了參數(shù)類型,則允許后面 使用舊式風(fēng)格的函數(shù)定義,而不會產(chǎn)生警告.)
-Wmissing-prototypes
如果沒有預(yù)先聲明函數(shù)原形就定義了全局函數(shù),編譯器就發(fā)出警告.即使函數(shù)定義自身提供了函數(shù)原形也會產(chǎn)生這個警告. 他的目的是檢查沒有在頭文件中聲明的全局函數(shù).
-Wmissing-declarations
如果沒有預(yù)先聲明就定義了全局函數(shù),編譯器就發(fā)出警告.即使函數(shù)定義自身提供了函數(shù)原形也會產(chǎn)生這個警告.這個選項 的目的是檢查沒有在頭文件中聲明的全局函數(shù).
-Wredundant-decls
如果在同一個可見域某定義多次聲明,編譯器就發(fā)出警告,即使這些重復(fù)聲明有效并且毫無差別.
-Wnested-externs
如果某extern聲明出現(xiàn)在函數(shù)內(nèi)部,編譯器就發(fā)出警告.
-Wenum-clash
對于不同枚舉類型之間的轉(zhuǎn)換發(fā)出警告(僅適用于C++).
-Wlong-long
如果使用了long long 類型就發(fā)出警告.該警告是缺省項.使用`-Wno-long-long' 選項能夠防止這個警告. `-Wlong-long'和`-Wno-long-long'僅在 `-pedantic'之下才起作用.
-Woverloaded-virtual
(僅適用于C++.)在繼承類中,虛函數(shù)的定義必須匹配虛函數(shù)在基類中聲明的類型特征(type signature).當(dāng) 繼承類聲明了某個函數(shù),它可能是個錯誤的嘗試企圖定義一個虛函數(shù),使用這個選項能夠產(chǎn)生警告:就是說,當(dāng)某個函數(shù)和基類 中的虛函數(shù)同名,但是類型特征不符合基類的任何虛函數(shù),編譯器將發(fā)出警告.
-Winline
如果某函數(shù)不能內(nèi)嵌(inline),無論是聲明為inline或者是指定了-finline-functions 選項,編譯器都將發(fā)出警告.
-Werror
視警告為錯誤;出現(xiàn)任何警告即放棄編譯.
調(diào)試選項(DEBUGGING OPTION)
GNU CC擁有許多特別選項,既可以調(diào)試用戶的程序,也可以對GCC排錯:
-g
以操作系統(tǒng)的本地格式(stabs, COFF, XCOFF,或DWARF).產(chǎn)生調(diào)試信息. GDB能夠使用這些調(diào)試信息.
在大多數(shù)使用stabs格式的系統(tǒng)上, `-g'選項啟動只有GDB才使用的額外調(diào)試信息;這些信息使GDB 調(diào)試效果更好,但是有可能導(dǎo)致其他調(diào)試器崩潰,或拒絕讀入程序.如果你確定要控制是否生成額外的信息, 使用`-gstabs+', `-gstabs', `-gxcoff+', `-gxcoff', `-gdwarf+',或`-gdwarf' (見下文).
和大多數(shù)C編譯器不同, GNU CC允許結(jié)合使用`-g'和`-O'選項.優(yōu)化的代碼偶爾制造 一些驚異的結(jié)果:某些聲明過的變量根本不存在;控制流程直接跑到?jīng)]有預(yù)料到的地方;某些語句因?yàn)橛嬎憬Y(jié)果是常量或已經(jīng)確定而 沒有執(zhí)行;某些語句在其他地方執(zhí)行,因?yàn)樗麄儽灰频窖h(huán)外面了.
然而它證明了調(diào)試優(yōu)化的輸出是可能的.對可能含有錯誤的程序使用優(yōu)化器是合理的.
如果GNU CC支持輸出多種調(diào)試信息,下面的選項則非常有用.
-ggdb
以本地格式(如果支持)輸出調(diào)試信息,盡可能包括GDB擴(kuò)展.
-gstabs
以stabs格式(如果支持)輸出調(diào)試信息,不包括GDB擴(kuò)展.這是大多數(shù)BSD系統(tǒng)上DBX使用的格式.
-gstabs+
以stabs格式(如果支持)輸出調(diào)試信息,使用只有GNU調(diào)試器(GDB)理解的GNU擴(kuò)展.使用這些擴(kuò)展有可能導(dǎo)致 其他調(diào)試器崩潰或拒絕讀入程序.
-gcoff
以COFF格式(如果支持)輸出調(diào)試信息.這是在System V第四版以前的大多數(shù)System V系統(tǒng)上SDB使用的 格式.
-gxcoff
以XCOFF格式(如果支持)輸出調(diào)試信息.這是IBM RS/6000系統(tǒng)上DBX調(diào)試器使用的格式.
-gxcoff+
以XCOFF格式(如果支持)輸出調(diào)試信息,使用只有GNU調(diào)試器(GDB)理解的GNU擴(kuò)展.使用這些擴(kuò)展有可能導(dǎo)致 其他調(diào)試器崩潰或拒絕讀入程序.
-gdwarf
以DWARF格式(如果支持)輸出調(diào)試信息.這是大多數(shù)System V第四版系統(tǒng)上SDB使用的格式.
-gdwarf+
以DWARF格式(如果支持)輸出調(diào)試信息,使用只有GNU調(diào)試器(GDB)理解的GNU擴(kuò)展.使用這些擴(kuò)展有可能導(dǎo)致 其他調(diào)試器崩潰或拒絕讀入程序.
-glevel
-ggdblevel
-gstabslevel
-gcofflevel -gxcofflevel
-gdwarflevel
請求生成調(diào)試信息,同時用level指出需要多少信息.默認(rèn)的level值是2.
Level 1輸出最少量的信息,僅夠在不打算調(diào)試的程序段內(nèi)backtrace.包括函數(shù)和外部變量的描述,但是 沒有局部變量和行號信息.
Level 3包含更多的信息,如程序中出現(xiàn)的所有宏定義.當(dāng)使用`-g3'選項的時候,某些調(diào)試器支持 宏擴(kuò)展.
-p
產(chǎn)生額外代碼,用于輸出profile信息,供分析程序prof使用.
-pg
產(chǎn)生額外代碼,用于輸出profile信息,供分析程序gprof使用.
-a
產(chǎn)生額外代碼,用于輸出基本塊(basic block)的profile信息,它記錄各個基本塊的執(zhí)行次數(shù),供諸如 tcov此類的程序分析.但是注意,這個數(shù)據(jù)格式并非tcov期待的.最終GNU gprof 將處理這些數(shù)據(jù).
-ax
產(chǎn)生額外代碼,用于從'bb.in'文件讀取基本塊的profile參數(shù),把profile的結(jié)果寫到'bb.out' 文件. `bb.in'包含一張函數(shù)列表.一旦進(jìn)入列表中的某個函數(shù), profile操作就開始,離開最外層的函數(shù)后, profile操作就結(jié)束.以`-'為前綴名的函數(shù)排除在profile操作之外.如果函數(shù)名不是唯一的,它可以寫成 `/path/filename.d:functionname'來澄清. `bb.out'將列出一些有效的文件名.這四個函數(shù)名具有 特殊含義: `__bb_jumps__'導(dǎo)致跳轉(zhuǎn)(jump)頻率寫進(jìn)`bb.out'. `__bb_trace__'導(dǎo)致基本塊序列通過 管道傳到`gzip',輸出`bbtrace.gz'文件. `__bb_hidecall__'導(dǎo)致從跟蹤(trace)中排除call 指令. `__bb_showret__'導(dǎo)致在跟蹤中包括返回指令.
-dletters
編譯的時候,在letters指定的時刻做調(diào)試轉(zhuǎn)儲(dump).用于調(diào)試編譯器.大多數(shù)轉(zhuǎn)儲的文件名 通過源文件名添加字詞獲得(例如`foo.c.rtl'或`foo.c.jump').
-dM
預(yù)處理結(jié)束的時候轉(zhuǎn)儲所有的宏定義,不輸出到文件.
-dN
預(yù)處理結(jié)束的時候轉(zhuǎn)儲所有的宏名.
-dD
預(yù)處理結(jié)束的時候轉(zhuǎn)儲所有的宏定義,同時進(jìn)行正常輸出.
-dy
語法分析(parse)的時候在標(biāo)準(zhǔn)錯誤轉(zhuǎn)儲調(diào)試信息.
-dr
RTL階段后轉(zhuǎn)儲到`file.rtl'.
-dx
僅對函數(shù)生成RTL,而不是編譯.通常和`r'聯(lián)用.
-dj
第一次跳轉(zhuǎn)優(yōu)化后轉(zhuǎn)儲到`file.jump'.
-ds
CSE (包括有時候跟在CSE后面的跳轉(zhuǎn)優(yōu)化)后轉(zhuǎn)儲到`file.cse'.
-dL
循環(huán)優(yōu)化后轉(zhuǎn)儲到`file.loop'.
-dt
第二次CSE處理(包括有時候跟在CSE后面的跳轉(zhuǎn)優(yōu)化)后轉(zhuǎn)儲到`file.cse2'.
-df
流程分析(flow analysis)后轉(zhuǎn)儲到`file.flow'.
-dc
指令組合(instruction combination)后轉(zhuǎn)儲到`file.combine'.
-dS
第一次指令安排(instruction schedule)后轉(zhuǎn)儲到`file.sched'.
-dl
局部寄存器分配后轉(zhuǎn)儲到`file.lreg'.
-dg
全局寄存器分配后轉(zhuǎn)儲到`file.greg'.
-dR
第二次指令安排(instruction schedule)后轉(zhuǎn)儲到`file.sched2'.
-dJ
最后一次跳轉(zhuǎn)優(yōu)化后轉(zhuǎn)儲到`file.jump2'.
-dd
推遲分支調(diào)度(delayed branch scheduling)后轉(zhuǎn)儲到`file.dbr'.
-dk
寄存器-堆棧轉(zhuǎn)換后轉(zhuǎn)儲到`file.stack'.
-da
產(chǎn)生以上所有的轉(zhuǎn)儲.
-dm
運(yùn)行結(jié)束后,在標(biāo)準(zhǔn)錯誤顯示內(nèi)存使用統(tǒng)計.
-dp
在匯編輸出加注指明使用了哪些模式(pattern)及其替代模式.
-fpretend-float
交叉編譯的時候,假定目標(biāo)機(jī)和宿主機(jī)使用同樣的浮點(diǎn)格式.它導(dǎo)致輸出錯誤的浮點(diǎn)常數(shù),但是在目標(biāo)機(jī)上運(yùn)行的時候, 真實(shí)的指令序列有可能和GNU CC希望的一樣.
-save-temps
保存那些通常是``臨時''的中間文件;置于當(dāng)前目錄下,并且根據(jù)源文件命名.因此,用`-c -save-temps'選項編譯`foo.c '會生成` foo.cpp'和`foo.s' 以及`foo.o'文件.
-print-file-name=library
顯示庫文件library的全路徑名,連接時會使用這個庫---其他什么事情都不作.根據(jù)這個選項, GNU CC既不編譯,也不連接,僅僅顯示文件名.
-print-libgcc-file-name
和`-print-file-name=libgcc.a'一樣.
-print-prog-name=program
類似于`-print-file-name',但是查找程序program如`cpp'.
優(yōu)化選項(OPTIMIZATION OPTION)
這些選項控制多種優(yōu)化措施:
-O
-O1
優(yōu)化.對于大函數(shù),優(yōu)化編譯占用稍微多的時間和相當(dāng)大的內(nèi)存.
不使用`-O'選項時,編譯器的目標(biāo)是減少編譯的開銷,使編譯結(jié)果能夠調(diào)試.語句是獨(dú)立的:如果在 兩條語句之間用斷點(diǎn)中止程序,你可以對任何變量重新賦值,或者在函數(shù)體內(nèi)把程序計數(shù)器指到其他語句,以及從源程序中 精確地獲取你期待的結(jié)果.
不使用`-O'選項時,只有聲明了register的變量才分配使用寄存器.編譯結(jié)果比不用 `-O'選項的PCC要略遜一籌.
使用了`-O'選項,編譯器會試圖減少目標(biāo)碼的大小和執(zhí)行時間.
如果指定了`-O'選項, `-fthread-jumps'和`-fdefer-pop'選項將被 打開.在有delay slot的機(jī)器上, `-fdelayed-branch'選項將被打開.在即使沒有幀指針 (frame pointer)也支持調(diào)試的機(jī)器上, `-fomit-frame-pointer'選項將被打開.某些機(jī)器上 還可能會打開其他選項.
-O2
多優(yōu)化一些.除了涉及空間和速度交換的優(yōu)化選項,執(zhí)行幾乎所有的優(yōu)化工作.例如不進(jìn)行循環(huán)展開(loop unrolling)和函數(shù)內(nèi)嵌(inlining).和-O選項比較,這個選項既增加了編譯時間,也提高了生成代碼的 運(yùn)行效果.
-O3
優(yōu)化的更多.除了打開-O2所做的一切,它還打開了-finline-functions選項.
-O0
不優(yōu)化.
如果指定了多個-O選項,不管帶不帶數(shù)字,最后一個選項才是生效的選項.
諸如`-fflag'此類的選項描述一些機(jī)器無關(guān)的開關(guān).大多數(shù)開關(guān)具有肯定和否定兩種格式; `-ffoo'開關(guān)選項的否定格式應(yīng)該是`-fno-foo'.下面的列表只展示了一種格式---那個不是 默認(rèn)選項的格式.你可以通過去掉或添加`no-'構(gòu)造出另一種格式.
-ffloat-store
不要在寄存器中存放浮點(diǎn)變量.這樣可以防止某些機(jī)器上不希望的過高精度,如68000的浮點(diǎn)寄存器(來自 68881)保存的精度超過了double應(yīng)該具有的精度.
對于大多數(shù)程序,過高精度只有好處.但是有些程序嚴(yán)格依賴于IEEE浮點(diǎn)數(shù)的定義.對這樣的程序可以使用 `-ffloat-store'選項.
-fmemoize-lookups
-fsave-memoized
使用探索法(heuristic)進(jìn)行更快的編譯(僅對C++).默認(rèn)情況下不使用探索法.由于探索法只對某些輸入文件 有效,其他程序的編譯速度會變得更慢.
第一次編譯器必須對成員函數(shù)(或?qū)Τ蓡T數(shù)據(jù)的引用)建立一個調(diào)用.它必須(1)判斷出這個類是否實(shí)現(xiàn)了那個名字的 成員函數(shù); (2)決定調(diào)用哪個成員函數(shù)(涉及到推測需要做哪種類型轉(zhuǎn)換); (3)檢查成員函數(shù)對調(diào)用者是否可見.所有這些構(gòu)成 更慢的編譯.一般情形,第二次對成員函數(shù)(或?qū)Τ蓡T數(shù)據(jù)的引用)建立的調(diào)用,必須再次經(jīng)過相同長度的處理.這意味著象 這樣的代碼
cout << "This " << p << " has " << n << " legs.
";
對整個三步驟要做六次遍歷.通過使用軟件緩存, ``命中''能夠顯著地減少這種代價.然而不幸的是,使用這種緩存 必須實(shí)現(xiàn)其他機(jī)制,帶來了它自己的開銷. `-fmemoize-lookups'選項打開軟件緩存.
因?yàn)楹瘮?shù)的正文環(huán)境不同,函數(shù)對成員和成員函數(shù)的訪問權(quán)(可見性)也可能不同, g++可能需要刷新緩存. 使用`-fmemoize-lookups'選項,每編譯完一個函數(shù)就刷新緩存.而`-fsave-memoized'選項 也啟用同樣的緩存,但是當(dāng)編譯器發(fā)覺最后編譯的函數(shù)的正文環(huán)境產(chǎn)生的訪問權(quán)和下一個待編譯的函數(shù)相同,編譯器就 保留緩存內(nèi)容.這對某個類定義許多成員函數(shù)時非常有用:除了某些其他類的友函數(shù),每個成員函數(shù)擁有和其他成員函數(shù)完全一樣 的訪問權(quán),因而無需刷新緩存.
-fno-default-inline
默認(rèn)為不要把成員函數(shù)內(nèi)嵌,因?yàn)樗鼈兌x在類的作用域內(nèi)(僅C++).
-fno-defer-pop
一旦函數(shù)返回,參數(shù)就立即彈出.對于那些調(diào)用函數(shù)后必須彈出參數(shù)的機(jī)器,編譯器一般情況下讓幾次函數(shù)調(diào)用的參數(shù) 堆積在棧上,然后一次全部彈出.
-fforce-mem
做數(shù)學(xué)運(yùn)算前把將要使用的內(nèi)存操作數(shù)送入寄存器.通過把內(nèi)存訪問轉(zhuǎn)換成潛在的公共子表達(dá)式,它可能產(chǎn)生較好的目標(biāo)碼. 如果它們不是公共子表達(dá)式,指令組合應(yīng)該消除各自的寄存器載荷.我樂意傾聽不同意見.
-fforce-addr
做數(shù)學(xué)運(yùn)算前把將要使用的內(nèi)存地址常數(shù)送入寄存器.它可能和`-fforce-mem'一樣產(chǎn)生較好的 目標(biāo)碼.我樂意傾聽不同意見.
-fomit-frame-pointer
對于不需要幀指針(frame pointer)的函數(shù),不要在寄存器中保存幀指針.這樣能夠避免保存,設(shè)置和恢復(fù) 幀指針的指令;同時對許多函數(shù)提供一個額外的寄存器. 但是在大多數(shù)機(jī)器上將無法調(diào)試.
某些機(jī)器上,如Vax,這個選項無效,因?yàn)闃?biāo)準(zhǔn)調(diào)用序列自動處理幀指針,通過假裝不存在而不保存任何東西.機(jī)器描述宏 FRAME_POINTER_REQUIRED控制目標(biāo)機(jī)是否支持這個選項.
-finline-functions
把所有簡單的函數(shù)集成進(jìn)調(diào)用者.編譯器探索式地決定哪些函數(shù)足夠簡單,值得這種集成.
如果集成了所有給定函數(shù)的調(diào)用,而且函數(shù)聲明為static,那么一般說來GCC有權(quán)不按匯編代碼輸出函數(shù).
-fcaller-saves
允許在寄存器里分配數(shù)值,但是這個方案通常受到各個函數(shù)調(diào)用的沖擊,因此GCC生成額外的代碼,在函數(shù)調(diào)用的 前后保存和復(fù)原寄存器內(nèi)容.僅當(dāng)生成代碼看上去優(yōu)于反之結(jié)果時才實(shí)現(xiàn)這樣的分配.
某些機(jī)器上該選項默認(rèn)為允許,通常這些機(jī)器沒有調(diào)用保護(hù)寄存器代替使用.
-fkeep-inline-functions
即使集成了某個函數(shù)的所有調(diào)用,而且該函數(shù)聲明為static,仍然輸出這個函數(shù)一個獨(dú)立的,運(yùn)行時可調(diào)用 的版本.
-fno-function-cse
不要把函數(shù)地址存入寄存器;讓調(diào)用固定函數(shù)的指令顯式給出函數(shù)地址.
這個選項產(chǎn)生效率較低的目標(biāo)碼,但是如果不用這個選項,某些不尋常的hack,改變匯編器的輸出,可能因優(yōu)化而帶來 困惑.
-fno-peephole
禁止任何機(jī)器相關(guān)的peephole優(yōu)化.
-ffast-math
這個選項出于速度優(yōu)化,允許GCC違反某些ANSI或IEEE規(guī)則/規(guī)格.例如,它允許編譯器假設(shè)sqrt 函數(shù)的參數(shù)是非負(fù)數(shù).
這個選項不被任何`-O'選項打開,因?yàn)閷τ趪?yán)格依靠IEEE或ANSI規(guī)則/規(guī)格實(shí)現(xiàn)的數(shù)學(xué)函數(shù),程序可能 會產(chǎn)生錯誤的結(jié)果.
下列選項控制特定的優(yōu)化. `-O2'選項打開下面的大多數(shù)優(yōu)化項,除了`-funroll-loops'和 `-funroll-all-loops'項.
而`-O'選項通常打開`-fthread-jumps'和`-fdelayed-branch' 優(yōu)化項,但是特定的機(jī)器上的默認(rèn)優(yōu)化項有可能改變.
如果特別情況下非常需要``微調(diào)''優(yōu)化,你可以使用下面的選項.
-fstrength-reduce
執(zhí)行循環(huán)強(qiáng)度縮小(loop strength reduction)優(yōu)化,并且消除重復(fù)變量.
-fthread-jumps
執(zhí)行優(yōu)化的地點(diǎn)是,如果某個跳轉(zhuǎn)分支的目的地存在另一個條件比較,而且該條件比較包含在前一個比較語句之內(nèi),那么 執(zhí)行優(yōu)化.根據(jù)條件是true或者false,前面那條分支重定向到第二條分支的目的地或者緊跟在第二條分支后面.
-funroll-loops
執(zhí)行循環(huán)展開(loop unrolling)優(yōu)化.僅對循環(huán)次數(shù)能夠在編譯時或運(yùn)行時確定的循環(huán)實(shí)行.
-funroll-all-loops
執(zhí)行循環(huán)展開(loop unrolling)優(yōu)化.對所有循環(huán)實(shí)行.通常使程序運(yùn)行的更慢.
-fcse-follow-jumps
在公共子表達(dá)式消元(common subexpression elimination)的時候,如果沒有其他路徑到達(dá)某個跳轉(zhuǎn)的 目的地,就掃過這條jump指令.例如,如果CSE遇到帶有else從句的if語句,當(dāng)條件測試為 false時, CSE就跟在jump后面.
-fcse-skip-blocks
它類似于`-fcse-follow-jumps'選項,但是CSE跟在條件跳轉(zhuǎn)后面,條件跳轉(zhuǎn)跳過了 語句塊(block).如果CSE遇到一條簡單的if語句,不帶else從句, `-fcse-skip-blocks'選項將導(dǎo)致CSE跟在if產(chǎn)生的跳轉(zhuǎn)后面.
-frerun-cse-after-loop
執(zhí)行循環(huán)優(yōu)化后,重新進(jìn)行公共子表達(dá)式消元.
-felide-constructors
如果看上去合理就省略構(gòu)造子(僅C++).根據(jù)這個選項,對于下面的代碼, GNU C++直接從調(diào)用foo 初始化y,而無需通過臨時變量:
A foo (); A y = foo ();
如果沒有這個選項, GNU C++首先通過調(diào)用類型A 合適的構(gòu)造子初始化y;然后把 foo的結(jié)果賦給臨時變量;最后,用臨時變量替換`y'的初始值.
ANSI C++標(biāo)準(zhǔn)草案規(guī)定了默認(rèn)行為(`-fno-elide-constructors').如果程序的構(gòu)造子存在 副效應(yīng), `-felide-constructors'選項能夠使程序有不同的表現(xiàn),因?yàn)榭赡芎雎砸恍?gòu)造子的調(diào)用.
-fexpensive-optimizations
執(zhí)行一些相對開銷較大的次要優(yōu)化.
-fdelayed-branch
如果對目標(biāo)機(jī)支持這個功能,它試圖重新排列指令,以便利用延遲分支(delayed branch)指令后面的指令空隙.
-fschedule-insns
如果對目標(biāo)機(jī)支持這個功能,它試圖重新排列指令,以便消除因數(shù)據(jù)未緒造成的執(zhí)行停頓.這可以幫助浮點(diǎn)運(yùn)算或內(nèi)存訪問 較慢的機(jī)器調(diào)取指令,允許其他指令先執(zhí)行,直到調(diào)取指令或浮點(diǎn)運(yùn)算完成.
-fschedule-insns2
類似于`-fschedule-insns'選項,但是在寄存器分配完成后,需要一個額外的指令調(diào)度過程.對于 寄存器數(shù)目相對較少,而且取內(nèi)存指令大于一個周期的機(jī)器,這個選項特別有用.
目標(biāo)機(jī)選項(TARGET OPTION)
缺省情況下, GNU CC編譯出本機(jī)類型的目標(biāo)碼.然而也可以把他安裝成交叉編譯器, 為其他機(jī)型編譯程序.事實(shí)上,針對不同的目標(biāo)機(jī),可以同時安裝GNU CC相應(yīng)的配置.然后用`-b'選項指定 目標(biāo)機(jī)種.
順便提一下,新版本和舊版本的GNU CC可以共存.其中一個版本(可能是最新的那個)為缺省版本,但是有時候你希望使用 其他版本.
-b machine
參數(shù)machine指出編譯的目標(biāo)機(jī)種.這個選項用于安裝為交叉編譯器的GNU CC.
參數(shù)machine的值和配置GNU CC交叉編譯器時設(shè)置的機(jī)器類型一樣.例如,如果交叉編譯器配置有 `configure i386v',意思是編譯80386上的System V目標(biāo)碼,那么你可以通過`-b i386v'運(yùn)行交叉編譯器.
如果沒有指定`-b'選項,通常指編譯本機(jī)目標(biāo)碼.
-V version
參數(shù)version指出運(yùn)行哪個版本的GNU CC.這個選項用于安裝了多個版本的GCC.例如,如果 version是`2.0',意味著運(yùn)行GNU CC 2.0版.
如果沒有指定`-V'選項,缺省版本取決于GNU CC的安裝方式,一般說來推薦使用通用版本.
機(jī)器相關(guān)選項(MACHINE DEPENDENT OPTION)
每一種目標(biāo)機(jī)型都有自己的特別選項,這些選項用`-m '開關(guān)引導(dǎo),選擇不同的硬件型號或配置---例如, 68010還是68020,有沒有浮點(diǎn)協(xié)處理器.通過指定選項,安裝 編譯器的一個版本能夠?yàn)樗械男吞柣蚺渲眠M(jìn)行編譯.
此外,編譯器的某些配置支持附加的特殊選項,通常是為了在命令行上兼容這個平臺的其他編譯器.
下面是針對68000系列定義的`-m'選項:
-m68000
-mc68000
輸出68000的目標(biāo)碼.如果編譯器按基于68000的系統(tǒng)配置,這個選項就是缺省選項.
-m68020
-mc68020
輸出68020的目標(biāo)碼(而不是68000).如果編譯器按基于68020的系統(tǒng)配置,這個選項就是缺省選項.
-m68881
輸出包含68881浮點(diǎn)指令的目標(biāo)碼.對于大多數(shù)基于68020的系統(tǒng)這是缺省選項,除非設(shè)置編譯器時指定了 -nfp .
-m68030
輸出68030的目標(biāo)碼.如果編譯器按基于68030的系統(tǒng)配置,這個選項就是缺省選項.
-m68040
輸出68040的目標(biāo)碼.如果編譯器按基于68040的系統(tǒng)配置,這個選項就是缺省選項.
-m68020-40
輸出68040的目標(biāo)碼,但是不使用新指令.生成的代碼可以在68020/68881上,也可以在68030或 68040上較有效地運(yùn)行.
-mfpa
輸出包含SUN FPA浮點(diǎn)指令的目標(biāo)碼.
-msoft-float
輸出包含浮點(diǎn)庫調(diào)用的目標(biāo)碼. 警告:所需的庫不是GNU CC的組成部分.一般說來GCC使用該機(jī)型本地C 編譯器的相應(yīng)部件,但是作交叉編譯時卻不能直接使用.你必須自己管理提供合適的函數(shù)庫用于交叉編譯.
-mshort
認(rèn)為int類型是16位寬,相當(dāng)于short int.
-mnobitfield
不使用位域(bit-field)指令. `-m68000'隱含指定了`-mnobitfield'.
-mbitfield
使用位域指令. `-m68020'隱含指定了`-mbitfield'.如果你使用未改裝的gcc,這就是 默認(rèn)選項.
-mrtd
采用另一種函數(shù)調(diào)用約定,函數(shù)接受固定數(shù)目的參數(shù),用rtd指令返回,該指令返回時彈出棧內(nèi)的參數(shù).這個 方法能夠使調(diào)用者節(jié)省一條指令,因?yàn)樗@里不需要彈出參數(shù).
這種調(diào)用約定不兼容UNIX的正常調(diào)用.因此如果你需要調(diào)用UNIX編譯器編譯的庫函數(shù),你就不能使用這個選項.
此外,所有參數(shù)數(shù)量可變地函數(shù)必須提供函數(shù)原型(包括printf);否則編譯器會生成錯誤的調(diào)用代碼.
另外,如果調(diào)用函數(shù)時攜帶了過多的參數(shù),編譯器將生成嚴(yán)重錯誤的代碼. (正常情況下,多余的參數(shù)被安全無害的忽略.)
68010和68020處理器支持rtd指令,但是68000不支持.
下面是針對VAX定義的`-m'選項:
-munix
禁止輸出某些跳轉(zhuǎn)指令(aobleq等等), VAX的UNIX匯編器無法跨越長范圍(long ranges) 進(jìn)行處理.
-mgnu
如果使用GNU匯編器,則輸出那些跳轉(zhuǎn)指令,
-mg
輸出g-format浮點(diǎn)數(shù),取代d-format.
下面是SPARC支持的`-m'選項開關(guān):
-mfpu
-mhard-float
輸出包含浮點(diǎn)指令的目標(biāo)碼.這是缺省選項.
-mno-fpu
-msoft-float
輸出包含浮點(diǎn)庫調(diào)用的目標(biāo)碼. 警告:沒有為SPARC提供GNU浮點(diǎn)庫.一般說來使用該機(jī)型本地C編譯器 的相應(yīng)部件,但是不能直接用于交叉編譯.你必須自己安排,提供用于交叉編譯的庫函數(shù).
-msoft-float改變了輸出文件中的調(diào)用約定;因此只有用這個選項編譯整個程序才有意義.
-mno-epilogue
-mepilogue
使用-mepilogue (缺省)選項時,編譯器總是把函數(shù)的退出代碼放在函數(shù)的尾部.任何在函數(shù)中間 的退出語句(例如C中的return語句)將產(chǎn)生出跳轉(zhuǎn)指令指向函數(shù)尾部.
使用-mno-epilogue選項時,編譯器盡量在每個函數(shù)退出點(diǎn)嵌入退出代碼.
-mno-v8
-mv8
-msparclite
這三個選項選擇不同種類的SPARC系統(tǒng).
默認(rèn)情況下(除非特別為Fujitsu SPARClite配置), GCC生成SPARC v7目標(biāo)碼.
-mv8生成SPARC v8目標(biāo)碼.他和v7目標(biāo)碼唯一的區(qū)別是,編譯器生成整數(shù)乘法和整數(shù)除法指令, SPARC v8支持該指令,而v7體系不支持.
-msparclite生成SPARClite目標(biāo)碼.增加了SPARClite支持的整數(shù)乘法,整數(shù)除法單步掃描 (integer divide step and scan (ffs))指令. v7體系不支持這些指令.
-mcypress
-msupersparc
這兩個選項選擇處理器型號,針對處理器進(jìn)行代碼優(yōu)化.
-mcypress選項(默認(rèn)項)使編譯器對Cypress CY7C602芯片優(yōu)化代碼, SparcStation/SparcServer 3xx系列使用這種芯片.該選項也適用于老式的SparcStation 1, 2, IPX 等機(jī)型..
-msupersparc選項使編譯器對SuperSparc處理器優(yōu)化代碼, SparcStation 10, 1000 和2000系列使用這種芯片.同時該選項啟用完整的SPARC v8指令集.
下面是針對Convex定義的`-m'選項:
-mc1
輸出C1的目標(biāo)碼.當(dāng)編譯器對C1配置時,這是默認(rèn)選項.
-mc2
輸出C2的目標(biāo)碼.當(dāng)編譯器對C2配置時,這是默認(rèn)選項.
-margcount
在每個參數(shù)列表的前面放置一個參數(shù)計數(shù)字(argument count word).某些不可移植的Convex和Vax 程序需要這個參數(shù)計數(shù)字. (調(diào)試器不需要他,除非函數(shù)帶有變長參數(shù)列表;這個信息存放在符號表中.)
-mnoargcount
忽略參數(shù)計數(shù)字.如果你使用未改裝的gcc,這是默認(rèn)選項.
下面是針對AMD Am29000定義的`-m'選項:
-mdw
生成的目標(biāo)碼認(rèn)為DW置位,就是說,字節(jié)和半字操作由硬件直接支持.該選項是默認(rèn)選項.
-mnodw
生成的目標(biāo)碼認(rèn)為DW沒有置位.
-mbw
生成的目標(biāo)碼認(rèn)為系統(tǒng)支持字節(jié)和半字寫操作.該選項是默認(rèn)選項.
-mnbw
生成的目標(biāo)碼認(rèn)為系統(tǒng)不支持字節(jié)和半字寫操作.該選項隱含開啟了`-mnodw'選項.
-msmall
使用小內(nèi)存模式,小內(nèi)存模式假設(shè)所有函數(shù)的地址位于某個256 KB段內(nèi),或者所有函數(shù)的絕對地址小于256K.這樣 就可以用call指令代替const, consth, calli指令序列.
-mlarge
假設(shè)不能使用call指令;這是默認(rèn)選項.
-m29050
輸出Am29050的目標(biāo)碼.
-m29000
輸出Am29000的目標(biāo)碼.這是默認(rèn)選項.
-mkernel-registers
生成的目標(biāo)碼引用gr64-gr95寄存器而不是gr96-gr127寄存器.該選項可以用于編譯 內(nèi)核代碼,內(nèi)核需要一組全局寄存器,這些全局寄存器和用戶模式使用的寄存器完全無關(guān).
注意,使用這個選項時, `-f'選項中的寄存器名字必須是normal, user-mode, names.
-muser-registers
使用普通全局寄存器集gr96-gr127.這是默認(rèn)選項.
-mstack-check
在每次堆棧調(diào)整后插入一條__msp_check調(diào)用.這個選項常用于內(nèi)核代碼.
下面是針對Motorola 88K體系定義的`-m'選項:
-m88000
生成的目標(biāo)碼可以在m88100和m88110上正常工作.
-m88100
生成的目標(biāo)碼在m88100上工作的最好,但也可以在m88110上運(yùn)行.
-m88110
生成的目標(biāo)碼在m88110上工作的最好,可能不能在m88100上運(yùn)行.
-midentify-revision
在匯編器的輸出端包含一條ident指令,記錄源文件名,編譯器名字和版本,時標(biāo),以及使用的編譯選項,
-mno-underscores
在匯編器的輸出端,符號名字前面不添加下劃線.默認(rèn)情況是在每個名字前面增加下劃線前綴.
-mno-check-zero-division
-mcheck-zero-division
早期型號的88K系統(tǒng)在除零操作上存在問題,特定情況下許多機(jī)器無法自陷.使用這些選項可以避免包含(或可以 顯明包含)附加的代碼,這些代碼能夠檢查除零錯,發(fā)送例外信號. GCC所有88K的配置默認(rèn)使用 `-mcheck-zero-division'選項.
-mocs-debug-info
-mno-ocs-debug-info
包含(或忽略)附加的調(diào)試信息(關(guān)于每個棧架結(jié)構(gòu)中寄存器的使用), 88Open Object Compatibility Standard, ``OCS'',對此信息做了說明. GDB不需要這些額外信息. DG/UX, SVr4,和Delta 88 SVr3.2的默認(rèn)配置是包含調(diào)試信息,其他88k機(jī)型的默認(rèn)配置是忽略這個信息.
-mocs-frame-position
-mno-ocs-frame-position
強(qiáng)制(或不要求)把寄存器值存儲到棧架結(jié)構(gòu)中的指定位置(按OCS的說明). DG/UX, Delta88 SVr3.2和 BCS的默認(rèn)配置使用`-mocs-frame-position'選項;其他88k機(jī)型的默認(rèn)配置是 `-mno-ocs-frame-position'.
-moptimize-arg-area
-mno-optimize-arg-area
控制如何在堆棧結(jié)構(gòu)中存儲函數(shù)參數(shù). `-moptimize-arg-area'節(jié)省空間,但是有可能宕掉某些 調(diào)試器(不是GDB). `-mno-optimize-arg-area'證實(shí)比標(biāo)準(zhǔn)選項好.默認(rèn)情況下GCC不優(yōu)化參數(shù)域.
-mshort-data-
num通過和r0關(guān)聯(lián),產(chǎn)生較小的數(shù)據(jù)引用(data reference),這樣就可以用單指令調(diào)入 一個數(shù)值(而不是平常的雙指令).用戶通過選項中的num控制改變哪種數(shù)據(jù)引用.例如,如果你指定了 `-mshort-data-512',那么受影響的數(shù)據(jù)引用是小于512字節(jié)的數(shù)據(jù)移動. -mshort-data-num選項對大于64K的num 無效.
-mserialize-volatile
-mno-serialize-volatile
產(chǎn)生,或不產(chǎn)生代碼來保證對易變內(nèi)存訪問的結(jié)果一致.
對于常用的處理器子型號, GNU CC始終默認(rèn)保證這種一致性.如何實(shí)現(xiàn)結(jié)果一致取決于處理器子型號.
m88100處理器不對內(nèi)存引用重新安排,因此訪問結(jié)果始終一致.如果使用了`-m88100'選項, GNU CC 不產(chǎn)生任何針對結(jié)果一致的特別指令.
m88110處理器的內(nèi)存引用順序并不始終符合指令請求的引用順序.特別是某條讀取指令可能在先前的存儲指令之前執(zhí)行. 多處理器環(huán)境下,亂序訪問擾亂了易變內(nèi)存訪問的結(jié)果一致.因此當(dāng)使用`-m88000'或`-m88110' 選項時, GNU CC在適當(dāng)?shù)臅r候產(chǎn)生特別的指令迫使執(zhí)行順序正確.
這些用于保證一致性的額外代碼有可能影響程序的性能.如果你確認(rèn)能夠安全地放棄這種保證,你可以使用 `-mno-serialize-volatile'選項.
如果你使用`-m88100'選項,但是需要在m88110處理器上運(yùn)行時的結(jié)果一致,你應(yīng)該加上 `-mserialize-volatile'選項.
[dvnews_page=GCC 中文手冊(下)]
-msvr4
-msvr3
打開(`-msvr4')或關(guān)閉(`-msvr3')和System V第四版(SVr4)相關(guān)的 編譯器擴(kuò)展.效果如下:
*
輸出哪種匯編語法(你可以使用`-mversion-03.00'選項單獨(dú)選擇).
*
`-msvr4'使C預(yù)處理器識別`#pragma weak'指令
*
`-msvr4'使GCC輸出額外的聲明指令(declaration directive),用于SVr4.
除了SVr4配置, `-msvr3'是所有m88K配置的默認(rèn)選項.
-mtrap-large-shift
-mhandle-large-shift
包含一些指令,用于檢測大于31位的位移(bit-shift);根據(jù)相應(yīng)的選項,對這樣的位移發(fā)出自陷 (trap)或執(zhí)行適當(dāng)?shù)奶幚泶a.默認(rèn)情況下, GCC對大位移不做特別處理.
-muse-div-instruction
很早以前的88K型號沒有(div)除法指令,因此默認(rèn)情況下GCC避免產(chǎn)生這條指令.而這個選項告訴GCC該指令是 安全的.
-mversion-03.00
在DG/UX配置中存在兩種風(fēng)格的SVr4.這個選項修改-msvr4 ,選擇hybrid-COFF或 real-ELF風(fēng)格.其他配置均忽略該選項.
-mwarn-passed-structs
如果某個函數(shù)把結(jié)構(gòu)當(dāng)做參數(shù)或結(jié)果傳遞, GCC發(fā)出警告.隨著C語言的發(fā)展,人們已經(jīng)改變了傳遞結(jié)構(gòu)的約定, 它往往導(dǎo)致移植問題.默認(rèn)情況下, GCC不會發(fā)出警告.
下面的選項用于IBM RS6000:
-mfp-in-toc
-mno-fp-in-toc
控制是否把浮點(diǎn)常量放到內(nèi)容表(TOC)中,內(nèi)容表存放所有的全局變量和函數(shù)地址.默認(rèn)情況下, GCC把浮點(diǎn)常量放到 這里;如果TOC溢出, `-mno-fp-in-toc'選項能夠減少TOC的大小,這樣就可以避免溢出.
下面的`-m'選項用于IBM RT PC:
-min-line-mul
對于整數(shù)乘法使用嵌入代碼.這是默認(rèn)選項.
-mcall-lib-mul
對于整數(shù)乘法使用lmul$$ .
-mfull-fp-blocks
生成全尺寸浮點(diǎn)數(shù)據(jù)塊,包括IBM建議的最少數(shù)量的活動空間(scratch space).這是默認(rèn)選項.
-mminimum-fp-blocks
不要在浮點(diǎn)數(shù)據(jù)塊中包括額外的活動空間.這樣就產(chǎn)生較小但是略慢的可執(zhí)行程序,因?yàn)榛顒涌臻g必須動態(tài)分配.
-mfp-arg-in-fpregs
采用不兼容IBM調(diào)用約定的調(diào)用序列,通過浮點(diǎn)寄存器傳送浮點(diǎn)參數(shù).注意,如果指定了這個選項, varargs.h和stdargs.h將無法支持浮點(diǎn)單元.
-mfp-arg-in-gregs
使用正常的調(diào)用約定處理浮點(diǎn)參數(shù).這是默認(rèn)選項.
-mhc-struct-return
通過內(nèi)存返回大于一個字的結(jié)構(gòu),而不是通過寄存器.用于兼容MetaWare HighC (hc)編譯器.使用 `-fpcc-struct-return'選項可以兼容Portable C編譯器(pcc).
-mnohc-struct-return
如果可以,通過寄存器返回某些大于一個字的結(jié)構(gòu).這是默認(rèn)選項.如果打算兼容IBM提供的編譯器,請使用 `-fpcc-struct-return'或`-mhc-struct-return'選項.
下面的`-m'選項用于MIPS家族的計算機(jī):
-mcpu=cpu-type
生成指令的時候,假設(shè)默認(rèn)的機(jī)器類型是cpu-type .默認(rèn)情況下的cpu-type是 default, GCC將選取任何機(jī)型上都是最長周期時間的指令,這樣才能使代碼在所有的MIPS處理器上以合理 的速度運(yùn)行. cpu-type的其他選擇是r2000, r3000, r4000,和 r6000.雖然選定某個cpu-type后, GCC將針對選定的芯片安排對應(yīng)的工作,但是如果 不指定?? -mips2或-mips3選項,編譯器不會輸出任何不符合MIPS ISA (instruction set architecture)一級的代碼.
-mips2
輸出MIPS ISA二級指令(可能的擴(kuò)展,如平方根指令). -mcpu=r4000或-mcpu=r6000 選項必須和-mips2聯(lián)用.
-mips3
輸出MIPS ISA三級指令(64位指令). -mcpu=r4000選項必須和-mips2聯(lián)用. (譯注:疑為-mips3)
-mint64
-mlong64
-mlonglong128
這些選項目前不起作用.
-mmips-as
產(chǎn)生用于MIPS匯編器的代碼,同時使用mips-tfile添加普通的調(diào)試信息.對于大多數(shù)平臺這是 默認(rèn)選項,除了OSF/1參考平臺,它使用OSF/rose目標(biāo)格式.如果打開了任一個-ggdb, -gstabs,或-gstabs+選項開關(guān), mips-tfile程序就把stab封裝在MIPS ECOFF里面.
-mgas
產(chǎn)生用于GNU匯編器的代碼.在OSF/1參考平臺上這是默認(rèn)選項,它使用OSF/rose目標(biāo)格式.
-mrnames
-mno-rnames
-mrnames開關(guān)選項告訴輸出代碼使用MIPS軟件名稱說明寄存器,而不是硬件名稱(就是說,用 a0代替$4). GNU匯編器不支持-mrnames選項,而MIPS匯編器則運(yùn)行MIPS C預(yù)處理器處理源文件. -mno-rnames是默認(rèn)選項.
-mgpopt
-mno-gpopt
-mgpopt開關(guān)選項要求在正文段中把所有的數(shù)據(jù)聲明寫到指令前面,使各種MIPS匯編器對短類型全局 或靜態(tài)數(shù)據(jù)項(short global or static data items)輸出單字內(nèi)存訪問而不是雙字內(nèi)存訪問.當(dāng)打開編譯優(yōu)化 時,這是默認(rèn)功能.
-mstats
-mno-stats
每次處理完非嵌入函數(shù)(non-inline function)后, -mstats開關(guān)選項使編譯器向標(biāo)準(zhǔn)錯誤文件 輸出一行關(guān)于程序的統(tǒng)計資料(保存的寄存器數(shù)目,堆棧大小,等等).
-mmemcpy
-mno-memcpy
-mmemcpy開關(guān)選項使所有的塊移動操作調(diào)用適當(dāng)?shù)膕tring函數(shù)(memcpy或 bcopy),而不是生成嵌入代碼.
-mmips-tfile
-mno-mips-tfile
當(dāng)MIPS匯編器生成mips-tfile文件(用于幫助調(diào)試)后, -mno-mips-tfile 開關(guān)選項阻止編譯器使用mips-tfile后期處理(postprocess)目標(biāo)文件.不運(yùn)行 mips-tfile就沒有調(diào)試器關(guān)注的局部變量.另外, stage2和stage3目標(biāo)文件將把 臨時文件名傳遞給匯編器,嵌在目標(biāo)文件中,這意味著不比較目標(biāo)文件是否相同.
-msoft-float
輸出包含浮點(diǎn)庫調(diào)用. 警告: 所需庫不是GNU CC的一部分.一般說來使用該機(jī)型本地C編譯器的相應(yīng)部件, 但是不能直接用于交叉編譯,你必須自己安排,提供交叉編譯適用的庫函數(shù).
-mhard-float
輸出包含浮點(diǎn)指令.如果編譯器沒有被改動,這就是默認(rèn)選項.
-mfp64
編譯器認(rèn)為狀態(tài)字的FR置位(on),也就是說存在32 64-bit浮點(diǎn)寄存器,而不是32 32-bit 浮點(diǎn)寄存器.同時必須打開-mcpu=r4000和-mips3開關(guān).
-mfp32
認(rèn)為存在32 32-bit浮點(diǎn)寄存器.這是默認(rèn)選項.
-mabicalls
-mno-abicalls
輸出(或不輸出) .abicalls, .cpload,和.cprestore偽指令,某些 System V.4版本用于位置無關(guān)代碼.
-mhalf-pic
-mno-half-pic
-mhalf-pic開關(guān)選項要求把外部引用的指針放到數(shù)據(jù)段,并且載入內(nèi)存,而不放到正文段.該選項目前 不起作用.
-G num
把小于等于num字節(jié)的全局或靜態(tài)數(shù)據(jù)放到小的數(shù)據(jù)段或bss段,而不是普通的數(shù)據(jù)段或bss段. 這樣匯編器可以輸出基于全局指針(gp或$28),的單字內(nèi)存訪問指令而非普通的雙字指令.默認(rèn)情況下, 用MIPS匯編器時num是8,而GNU匯編器則為0.另外, -Gnum選項也被傳遞 給匯編器和連接器.所有的模塊必須在相同的-Gnum值下編譯.
-nocpp
匯編用戶匯編文件(帶有`.s'后綴)時,告訴MIPS匯編器不要運(yùn)行預(yù)處理器.
下面的`-m'選項用于Intel 80386族計算機(jī): -m486
-mno-486
控制是否生成對486優(yōu)化的代碼.
-msoft-float
輸出包含浮點(diǎn)庫調(diào)用. 警告: 所需庫不是GNU CC的一部分.一般說來使用該機(jī)型本地C編譯器的相應(yīng)部件, 但是不能直接用于交叉編譯,你必須自己安排,提供交叉編譯適用的庫函數(shù).
在函數(shù)把浮點(diǎn)返回值放在80387寄存器棧的機(jī)器上,即使設(shè)置了`-msoft-float'選項,也可能會發(fā)出 一些浮點(diǎn)操作碼.
-mno-fp-ret-in-387
不用FPU寄存器返回函數(shù)值.
通常函數(shù)調(diào)用約定把float和double的返回值放在FPU寄存器中,即使不存在FPU. 這種作法的理念是操作系統(tǒng)應(yīng)該仿真出FPU.
而`-mno-fp-ret-in-387'選項使浮點(diǎn)值通過普通的CPU寄存器返回.
下面的`-m'選項用于HPPA族計算機(jī):
-mpa-risc-1-0
生成PA 1.0處理器的目標(biāo)碼.
-mpa-risc-1-1
生成PA 1.1處理器的目標(biāo)碼.
-mkernel
生成適用于內(nèi)核的目標(biāo)碼.特別要避免add指令,它有一個參數(shù)是DP寄存器;用addil 代替add指令.這樣可以避免HP-UX連接器的某個嚴(yán)重bug.
-mshared-libs
生成能夠連接HP-UX共享庫的目標(biāo)碼.該選項還沒有實(shí)現(xiàn)全部功能,對PA目標(biāo)默認(rèn)為關(guān)閉.使用這個選項會導(dǎo)致 編譯器生成錯誤的目標(biāo)碼.
-mno-shared-libs
不生成連接HP-UX共享庫的目標(biāo)碼.這是PA目標(biāo)的默認(rèn)選項.
-mlong-calls
生成的目標(biāo)碼允許同一個源文件中的函數(shù)調(diào)用,調(diào)用點(diǎn)和被調(diào)函數(shù)的距離可以超過256K之遠(yuǎn).不需要打開這個開關(guān)選項, 除非連接器給出``branch out of range errors``這樣的錯誤.
-mdisable-fpregs
防止任何情況下使用浮點(diǎn)寄存器.編譯內(nèi)核需要這個選項,內(nèi)核切換浮點(diǎn)寄存器的執(zhí)行環(huán)境速度非常緩慢.如果打開了這個 開關(guān)選項同時試圖浮點(diǎn)操作,編譯將失敗.
-mdisable-indexing
防止編譯器使用索引地址模式(indexing address mode).這樣在MACH上編譯MIG生成的代碼時,可以 避免一些非?;逎膯栴}.
-mtrailing-colon
在標(biāo)記定義(label definition)的末尾添加一個冒號(用于ELF匯編器).
下面的`-m'選項用于Intel 80960族計算機(jī):
-mcpu-type
默認(rèn)機(jī)器類型為cpu-type ,使編譯器產(chǎn)生對應(yīng)的指令,地址模式和內(nèi)存對齊.默認(rèn)的 cpu-type是kb;其他選擇有ka, mc, ca, cf, sa,和sb.
-mnumerics
-msoft-float
-mnumerics開關(guān)選項指出處理器不支持浮點(diǎn)指令. -msoft-float開關(guān)選項指出不應(yīng)該認(rèn)為 機(jī)器支持浮點(diǎn)操作.
-mleaf-procedures
-mno-leaf-procedures
企圖(或防止)改變?nèi)~過程(leaf procedure),使其可被bal指令以及call指令 調(diào)用.對于直接函數(shù)調(diào)用,如果bal指令能夠被匯編器或連接器替換,這可以產(chǎn)生更有效的代碼,但是其他情況下 產(chǎn)生較低效的代碼,例如通過函數(shù)指針調(diào)用函數(shù),或使用了不支持這種優(yōu)化的連接器.
-mtail-call
-mno-tail-call
執(zhí)行(或不執(zhí)行)更多的嘗試(除過編譯器那些機(jī)器無關(guān)部分),優(yōu)化進(jìn)入分支的尾遞歸(tail-recursive)調(diào)用.你 可能不需要這個,因?yàn)闄z測什么地方無效沒有全部完成.默認(rèn)開關(guān)是-mno-tail-call.
-mcomplex-addr
-mno-complex-addr
認(rèn)為(或不認(rèn)為)在當(dāng)前的i960設(shè)備上,值得使用復(fù)合地址模式(complex addressing mode).復(fù)合地址模式 可能不值得用到K系列,但是一定值得用在C系列.目前除了CB和CC處理器,其他處理器上 -mcomplex-addr是默認(rèn)選項.
-mcode-align
-mno-code-align
把目標(biāo)碼對齊到8字節(jié)邊界上(或者不必),這樣讀取會快一些.目前只對C系列默認(rèn)打開.
-mic-compat
-mic2.0-compat
-mic3.0-compat
兼容iC960 v2.0或v3.0.
-masm-compat
-mintel-asm
兼容iC960匯編器.
-mstrict-align
-mno-strict-align
不允許(或允許)邊界不對齊的訪問.
-mold-align
使結(jié)構(gòu)對齊(structure-alignment)兼容Intel的gcc發(fā)行版本1.3 (基于gcc 1.37).目前 這個選項有點(diǎn)問題,因?yàn)?pragma align 1總是作同樣的設(shè)定,而且無法關(guān)掉.
下面的`-m'選項用于DEC Alpha設(shè)備:
-mno-soft-float
-msoft-float
使用(或不使用)硬件浮點(diǎn)指令進(jìn)行浮點(diǎn)運(yùn)算.打開-msoft-float時,將使用 `libgcc1.c'中的函數(shù)執(zhí)行浮點(diǎn)運(yùn)算.除非它們被仿真浮點(diǎn)操作的例程替換,或者類似,它們被編譯為調(diào)用 仿真例程,這些例程將發(fā)出浮點(diǎn)操作.如果你為不帶浮點(diǎn)操作的Alpha編譯程序,你必須確保建立了這個庫,以便不調(diào)用 仿真例程.
注意,不帶浮點(diǎn)操作的Alpha也要求擁有浮點(diǎn)寄存器.
-mfp-reg
-mno-fp-regs
生成使用(或不使用)浮點(diǎn)寄存器群的目標(biāo)代碼. -mno-fp-regs包含有-msoft-float 開關(guān)選項.如果不使用浮點(diǎn)寄存器,浮點(diǎn)操作數(shù)就象整數(shù)一樣通過整數(shù)寄存器傳送,浮點(diǎn)運(yùn)算結(jié)果放到$0而不是$f0.這是非標(biāo)準(zhǔn) 調(diào)用,因此任何帶有浮點(diǎn)參數(shù)或返回值的函數(shù),如果被-mno-fp-regs開關(guān)編譯過的目標(biāo)碼調(diào)用,它也必須 用這個選項編譯.
這個選項的典型用法是建立內(nèi)核,內(nèi)核不使用任何浮點(diǎn)寄存器,因此沒必要保存和恢復(fù)這些寄存器.
下面附加的選項出現(xiàn)在System V第四版中,用于兼容這些系統(tǒng)中的其他編譯器:
-G
在SVr4系統(tǒng)中, gcc出于兼容接受了`-G'選項(然后傳遞給連接器).可是我們建議使用 `-symbolic'或`-shared'選項,而不在gcc命令行上出現(xiàn)連接選項.
-Qy
驗(yàn)證編譯器用的工具的版本,輸出到.ident匯編指令.
-Qn
制止輸出端的.ident指令(默認(rèn)選項).
-YP,dirs
對于`-l'指定的庫文件,只搜索dirs.你可以在dirs中用冒號隔開各個 目錄項.
-Ym,dir
在dir目錄中尋找M4預(yù)處理器.匯編器使用這個選項.
代碼生成選項(CODE GENERATION OPTION)
下面的選項和平臺無關(guān),用于控制目標(biāo)碼生成的接口約定.
大部分選項以`-f'開始.這些選項擁有確定和否定兩種格式; `-ffoo'的否定格式是 `-fno-foo'.后面的描述將只列舉其中的一個格式---非默認(rèn)的格式.你可以通過添加或去掉 `no-'推測出另一個格式.
-fnonnull-objects
假設(shè)通過引用(reference)取得的對象不為null (僅C++).
一般說來, GNU C++對通過引用取得的對象作保守假設(shè).例如,編譯器一定會檢查下似代碼中的a不為 null:
obj &a = g (); a.f (2);
檢查類似的引用需要額外的代碼,然而對于很多程序是不必要的.如果你的程序不要求這種檢查,你可以用 `-fnonnull-objects'選項忽略它.
-fpcc-struct-return
函數(shù)返回struct和union值時,采用和本地編譯器相同的參數(shù)約定.對于較小的結(jié)構(gòu), 這種約定的效率偏低,而且很多機(jī)器上不能重入;它的優(yōu)點(diǎn)是允許GCC編譯的目標(biāo)碼和PCC編譯的目標(biāo)碼互相調(diào)用.
-freg-struct-return
一有可能就通過寄存器返回struct和union函數(shù)值.對于較小的結(jié)構(gòu),它比 -fpcc-struct-return更有效率.
如果既沒有指定-fpcc-struct-return ,也沒有指定-freg-struct-return, GNU CC默認(rèn)使用目標(biāo)機(jī)的標(biāo)準(zhǔn)約定.如果沒有標(biāo)準(zhǔn)約定, GNU CC默認(rèn)采用-fpcc-struct-return.
-fshort-enums
給enum類型只分配它聲明的值域范圍的字節(jié)數(shù).就是說, enum類型等于大小足夠的 最小整數(shù)類型.
-fshort-double
使double類型的大小和float一樣.
-fshared-data
要求編譯結(jié)果的數(shù)據(jù)和非const變量是共享數(shù)據(jù),而不是私有數(shù)據(jù).這種差別僅在某些操作系統(tǒng)上面有意義, 那里的共享數(shù)據(jù)在同一個程序的若干進(jìn)程間共享,而私有數(shù)據(jù)在每個進(jìn)程內(nèi)都有副件.
-fno-common
即使未初始化的全局變量也分配在目標(biāo)文件的bss段,而不是把它們當(dāng)做普通塊(common block)建立.這樣的 結(jié)果是,如果在兩個不同的編譯結(jié)果中聲明了同一個變量(沒使用extern ),連接它們時會產(chǎn)生錯誤. 這個選項可能有用的唯一情況是,你希望確認(rèn)程序能在其他系統(tǒng)上運(yùn)行,而其他系統(tǒng)總是這么做.
-fno-ident
忽略`#ident'指令.
-fno-gnu-linker
不要把全局初始化部件(如C++的構(gòu)造子和解構(gòu)子)輸出為GNU連接器使用的格式(在GNU連接器是標(biāo)準(zhǔn)方法的系統(tǒng) 上).當(dāng)你打算使用非GNU連接器的時候可以用這個選項,非GNU連接器也需要collect2程序確保系統(tǒng)連接器 放入構(gòu)造子(constructor)和解構(gòu)子(destructor). (GNU CC的發(fā)布包中包含有collect2 程序.)對于必須使用collect2的系統(tǒng),編譯器驅(qū)動程序gcc自動配置為這么做.
-finhibit-size-directive
不要輸出.size匯編指令,或其他類似指令,當(dāng)某個函數(shù)一分為二,兩部分在內(nèi)存中距離很遠(yuǎn)時會引起問題. 當(dāng)編譯`crtstuff.c'時需要這個選項;其他情況下都不應(yīng)該使用.
-fverbose-asm
輸出匯編代碼時放些額外的注釋信息.這個選項僅用于確實(shí)需要閱讀匯編輸出的時候(可能調(diào)試編譯器自己的時候).
-fvolatile
使編譯器認(rèn)為所有通過指針訪問的內(nèi)存是易變內(nèi)存(volatile).
-fvolatile-global
使編譯器認(rèn)為所有的外部和全局變量是易變內(nèi)存.
-fpic
如果支持這種目標(biāo)機(jī),編譯器就生成位置無關(guān)目標(biāo)碼.適用于共享庫(shared library).
-fPIC
如果支持這種目標(biāo)機(jī),編譯器就輸出位置無關(guān)目標(biāo)碼.適用于動態(tài)連接(dynamic linking),即使分支需要大范圍 轉(zhuǎn)移.
-ffixed-reg
把名為reg的寄存器按固定寄存器看待(fixed register);生成的目標(biāo)碼不應(yīng)該引用它(除了或許 用作棧指針,幀指針,或其他固定的角色).
reg必須是寄存器的名字.寄存器名字取決于機(jī)器,用機(jī)器描述宏文件的REGISTER_NAMES宏 定義.
這個選項沒有否定格式,因?yàn)樗谐鋈愤x擇.
-fcall-used-reg
把名為reg的寄存器按可分配寄存器看待,不能在函數(shù)調(diào)用間使用.可以臨時使用或當(dāng)做變量使用,生存期 不超過一個函數(shù).這樣編譯的函數(shù)無需保存和恢復(fù)reg寄存器.
如果在可執(zhí)行模塊中,把這個選項說明的寄存器用作固定角色將會產(chǎn)生災(zāi)難性結(jié)果,如棧指針或幀指針.
這個選項沒有否定格式,因?yàn)樗谐鋈愤x擇.
-fcall-saved-reg
把名為reg的寄存器按函數(shù)保護(hù)的可分配寄存器看待.可以臨時使用或當(dāng)做變量使用,它甚至能在函數(shù)間 生存.這樣編譯的函數(shù)會保存和恢復(fù)使用中的reg寄存器.
如果在可執(zhí)行模塊中,把這個選項說明的寄存器用作固定角色將會產(chǎn)生災(zāi)難性結(jié)果,如棧指針或幀指針.
另一種災(zāi)難是用這個選項說明的寄存器返回函數(shù)值.
這個選項沒有否定格式,因?yàn)樗谐鋈愤x擇.
PRAGMAS
GNU C++支持兩條`#pragma'指令使同一個頭文件有兩個用途:對象類的接口定義, 對象類完整的內(nèi)容定義.
#pragma interface
(僅對C++)在定義對象類的頭文件中,使用這個指令可以節(jié)省大部分采用該類的目標(biāo)文件的大小.一般說來,某些信息 (內(nèi)嵌成員函數(shù)的備份副件,調(diào)試信息,實(shí)現(xiàn)虛函數(shù)的內(nèi)部表格等)的本地副件必須保存在包含類定義的各個目標(biāo)文件中.使用這個 pragma指令能夠避免這樣的復(fù)制.當(dāng)編譯中引用包含`#pragma interface'指令的頭文件時,就 不會產(chǎn)生這些輔助信息(除非輸入的主文件使用了`#pragma implementation'指令).作為替代,目標(biāo)文件 將包含可被連接時解析的引用(reference).
#pragma implementation
#pragma implementation "objects.h"
(僅對C++)如果要求從頭文件產(chǎn)生完整的輸出(并且全局可見),你應(yīng)該在主輸入文件中使用這條pragma.頭文件 中應(yīng)該依次使用`#pragma interface'指令.在implementation文件中將產(chǎn)生全部內(nèi)嵌成員函數(shù) 的備份,調(diào)試信息,實(shí)現(xiàn)虛函數(shù)的內(nèi)部表格等.
如果`#pragma implementation'不帶參數(shù),它指的是和源文件有相同基本名的包含文件;例如, `allclass.cc'中, `#pragma implementation'等于`#pragma implementation allclass.h'.如果某個implementation文件需要從多個頭文件引入代碼,就應(yīng)該 使用這個字符串參數(shù).
不可能把一個頭文件里面的內(nèi)容分割到多個implementation文件中.
文件(FILE)
file.c C源文件
file.h C頭文件(預(yù)處理文件)
file.i 預(yù)處理后的C源文件
file.C C++源文件
file.cc C++源文件
file.cxx C++源文件
file.m Objective-C源文件
file.s 匯編語言文件
file.o 目標(biāo)文件
a.out 連接的輸出文件
TMPDIR/cc* 臨時文件
LIBDIR/cpp 預(yù)處理器
LIBDIR/cc1 C編譯器
LIBDIR/cc1plus C++編譯器
LIBDIR/collect 某些機(jī)器需要的連接器前端(front end)程序
LIBDIR/libgcc.a GCC子例程(subroutine)庫
/lib/crt[01n].o 啟動例程(start-up)
LIBDIR/ccrt0 C++的附加啟動例程
/lib/libc.a 標(biāo)準(zhǔn)C庫,另見intro (3)
/usr/include #include文件的標(biāo)準(zhǔn)目錄
LIBDIR/include #include文件的標(biāo)準(zhǔn)gcc目錄
LIBDIR/g++-include #include文件的附加g++目錄
LIBDIR通常為/usr/local/lib/machine/version.
TMPDIR來自環(huán)境變量TMPDIR (如果存在,缺省為/usr/tmp ,否則為 /tmp).
另見(SEE ALSO)
cpp(1), as(1), ld(1), gdb(1), adb(1), dbx(1), sdb(1).
info中 `gcc', `cpp', `as', `ld',和`gdb'的條目.
Using and Porting GNU CC (for version 2.0), Richard M. Stallman; The C Preprocessor, Richard M. Stallman; Debugging with GDB: the GNU Source-Level Debugger, Richard M. Stallman和Roland H. Pesch; Using as: the GNU Assembler, Dean Elsner, Jay Fenlason & friends; ld: the GNU linker, Steve Chamberlain和Roland Pesch.
BUGS
關(guān)于報告差錯的指導(dǎo)請查閱GCC手冊.
版權(quán)(COPYING)
Copyright 1991, 1992, 1993 Free Software Foundation, Inc.
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.
Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be included in translations approved by the Free Software Foundation instead of in the original English.
作者(AUTHORS)
關(guān)于GNU CC的奉獻(xiàn)者請查閱GUN CC手冊.
[中文版維護(hù)人]
徐明< xuming@users.sourceforge.net >
[中文版最新更新]
2003/05/13第一版
《中國Linux論壇man手冊頁翻譯計劃》
http://cmpp.linuxforum.net/