GUN gcc 中文手冊

NAME

gcc,g++-GNU工程的CC++編譯器(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)

CC++編譯器是集成的.他們都要用四個步驟中的一個或多個處理輸入文件預處理(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的特性,例如asminline和 typeof關鍵字,以及諸如unixvax這些表明當前系統類型的預定義宏.同時開啓 不受歡迎和極少使用的ANSI trigraph特性,以及禁止`$'成爲標識符的一部分.

儘管使用了`-ansi'選項,下面這些可選的關鍵字__asm____extension____inline____typeof__仍然有效.你當然不會把 他們用在ANSI C程序中,但可以把他們放在頭文件裏,因爲編譯包含這些頭文件的程序時,可能會指定 `-ansi'選項.另外一些預定義宏,__unix____vax__,無論有沒有使用 `-ansi'選項,始終有效.

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

使用`-ansi'選項的時候,預處理器會預定義一個__STRICT_ANSI__.有些頭文件 關注此宏,以避免聲明某些函數,或者避免定義某些宏,這些函數和宏不被ANSI標準調用;這樣就不會干擾在其他地方 使用這些名字的程序了.

-fno-asm

不把asminlinetypeof當作關鍵字,因此這些詞可以用做標識符.用 __asm____inline____typeof__能夠替代他們. `-ansi隱含聲明瞭`-fno-asm'.

-fno-builtin

不接受不是兩個下劃線開頭的內建函數(built-in function).目前受影響的函數有_exitabortabsallocacosexitfabslabsmemcmpmemcpysinsqrt,strcmpstrcpy,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++).正常情況下,這樣的函數fooC++中意味着參數爲空.

-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++允許從 enumint的轉換,反之則不行.

-fexternal-templates

爲模板聲明(template declaration)產生較小的代碼(僅限於C++),方法是對於每個模板函數 (template function),只在定義他們的地方生成一個副本.想要成功使用這個選項,你必須在所有使用模板的 文件中,標記`#pragma implementation' (定義)`#pragma interface' (聲明).

當程序用`-fexternal-templates'編譯時,模板實例(template instantiation) 全部是外部類型.你必須讓需要的實例在實現文件中出現.可以通過typedef實現這一點,他引用所需的每個 實例.相對應的,如果編譯時使用缺省選項`-fno-external-templates',所有模板實例明確的設爲內置.

-fall-virtual

所有可能的成員函數默認爲虛函數.所有的成員函數(除了構造子函數和newdelete 成員操作符)視爲所在類的虛函數.

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

-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 charunsigned char.但是許多程序已經寫成只用簡單的char,並且期待這是有符號數(或者無符號數,具體情況取決於 編寫程序的目標機器).這個選項,和它的反義選項,使那樣的程序工作在對應的默認值上.

char的類型始終應該明確定義爲signed charunsigned 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預處理器,預處理器用在正式編譯以前,源文件進行某種處理.

如果指定了`-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

把目錄添加到第二包含路徑中.目錄名由prefixdir合併而成,這裏 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不知道某些函數永不返回(含有abortlongjmp),因此有可能出現 虛假警告.

   *

表達式語句或逗號表達式的左側沒有產生作用(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

檢查對printfscanf等函數的調用,確認各個參數類型和格式串中的一致.

-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, 23,那麼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)增加,編譯器就發出警告.例如,某些機器上 只能在24字節邊界上訪問整數,如果在這種機型上把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違反某些ANSIIEEE規則/規格.例如,它允許編譯器假設sqrt 函數的參數是非負數.

這個選項不被任何`-O'選項打開,因爲對於嚴格依靠IEEEANSI規則/規格實現的數學函數,程序可能 會產生錯誤的結果.

下列選項控制特定的優化. `-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++首先通過調用類型合適的構造子初始化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使用該機型本地編譯器的相應部件,但是作交叉編譯時卻不能直接使用.你必須自己管理提供合適的函數庫用於交叉編譯.

-mshort

認爲int類型是16位寬,相當於short int.

-mnobitfield

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

-mbitfield

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

-mrtd

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

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

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

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

6801068020處理器支持rtd指令,但是68000不支持.

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

-munix

禁止輸出某些跳轉指令(aobleq等等), VAXUNIX彙編器無法跨越長範圍(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).某些不可移植的ConvexVax 程序需要這個參數計數字. (調試器不需要他,除非函數帶有變長參數列表;這個信息存放在符號表中.)

-mnoargcount

忽略參數計數字.如果你使用未改裝的gcc,這是默認選項.

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

-mdw

生成的目標碼認爲DW置位,就是說,字節和半字操作由硬件直接支持.該選項是默認選項.

-mnodw

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

-mbw

生成的目標碼認爲系統支持字節和半字寫操作.該選項是默認選項.

-mnbw

生成的目標碼認爲系統不支持字節和半字寫操作.該選項隱含開啓了`-mnodw'選項.

-msmall

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

-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

生成的目標碼可以在m88100m88110上正常工作.

-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選項對大於64Knum 無效.

-mserialize-volatile

-mno-serialize-volatile

產生,或不產生代碼來保證對易變內存訪問的結果一致.

對於常用的處理器子型號, GNU CC始終默認保證這種一致性.如何實現結果一致取決於處理器子型號.

m88100處理器不對內存引用重新安排,因此訪問結果始終一致.如果使用了`-m88100'選項, GNU CC 不產生任何針對結果一致的特別指令.

m88110處理器的內存引用順序並不始終符合指令請求的引用順序.特別是某條讀取指令可能在先前的存儲指令之前執行多處理器環境下,亂序訪問擾亂了易變內存訪問的結果一致.因此當使用`-m88000'`-m88110選項時, GNU CC在適當的時候產生特別的指令迫使執行順序正確.

這些用於保證一致性的額外代碼有可能影響程序的性能.如果你確認能夠安全地放棄這種保證,你可以使用 `-mno-serialize-volatile'選項.

如果你使用`-m88100'選項,但是需要在m88110處理器上運行時的結果一致,你應該加上 `-mserialize-volatile'選項.

-msvr4

-msvr3

打開(`-msvr4')或關閉(`-msvr3')System V第四版(SVr4)相關的 編譯器擴展.效果如下:

   *

輸出哪種彙編語法(你可以使用`-mversion-03.00'選項單獨選擇).

   *

`-msvr4'使C預處理器識別`#pragma weak'指令

   *

`-msvr4'使GCC輸出額外的聲明指令(declaration directive),用於SVr4.

除了SVr4配置, `-msvr3'是所有m88K配置的默認選項.

-mtrap-large-shift

-mhandle-large-shift

包含一些指令,用於檢測大於31位的位移(bit-shift);根據相應的選項,對這樣的位移發出自陷 (trap)或執行適當的處理代碼.默認情況下, GCC對大位移不做特別處理.

-muse-div-instruction

很早以前的88K型號沒有(div)除法指令,因此默認情況下GCC避免產生這條指令.而這個選項告訴GCC該指令是 安全的.

-mversion-03.00

DG/UX配置中存在兩種風格的SVr4.這個選項修改-msvr4 ,選擇hybrid-COFF或 real-ELF風格.其他配置均忽略該選項.

-mwarn-passed-structs

如果某個函數把結構當做參數或結果傳遞, GCC發出警告.隨着C語言的發展,人們已經改變了傳遞結構的約定它往往導致移植問題.默認情況下, GCC不會發出警告.

下面的選項用於IBM RS6000:

-mfp-in-toc

-mno-fp-in-toc

控制是否把浮點常量放到內容表(TOC),內容表存放所有的全局變量和函數地址.默認情況下, GCC把浮點常量放到 這裏;如果TOC溢出, `-mno-fp-in-toc'選項能夠減少TOC的大小,這樣就可以避免溢出.

下面的`-m'選項用於IBM RT PC:

-min-line-mul

對於整數乘法使用嵌入代碼.這是默認選項.

-mcall-lib-mul

對於整數乘法使用lmul$$ .

-mfull-fp-blocks

生成全尺寸浮點數據塊,包括IBM建議的最少數量的活動空間(scratch space).這是默認選項.

-mminimum-fp-blocks

不要在浮點數據塊中包括額外的活動空間.這樣就產生較小但是略慢的可執行程序,因爲活動空間必須動態分配.

-mfp-arg-in-fpregs

採用不兼容IBM調用約定的調用序列,通過浮點寄存器傳送浮點參數.注意,如果指定了這個選項varargs.hstdargs.h將無法支持浮點單元.

-mfp-arg-in-gregs

使用正常的調用約定處理浮點參數.這是默認選項.

-mhc-struct-return

通過內存返回大於一個字的結構,而不是通過寄存器.用於兼容MetaWare HighC (hc)編譯器.使用 `-fpcc-struct-return'選項可以兼容Portable C編譯器(pcc).

-mnohc-struct-return

如果可以,通過寄存器返回某些大於一個字的結構.這是默認選項.如果打算兼容IBM提供的編譯器,請使用 `-fpcc-struct-return'`-mhc-struct-return'選項.

下面的`-m'選項用於MIPS家族的計算機:

-mcpu=cpu-type

生成指令的時候,假設默認的機器類型是cpu-type .默認情況下的cpu-type是 default, GCC將選取任何機型上都是最長週期時間的指令,這樣才能使代碼在所有的MIPS處理器上以合理 的速度運行cpu-type的其他選擇是r2000r3000r4000,和 r6000.雖然選定某個cpu-type, GCC將針對選定的芯片安排對應的工作,但是如果 不指定?? -mips2-mips3選項,編譯器不會輸出任何不符合MIPS ISA (instruction set architecture)一級的代碼.

-mips2

輸出MIPS ISA二級指令(可能的擴展,如平方根指令). -mcpu=r4000-mcpu=r6000 選項必須和-mips2聯用.

-mips3

輸出MIPS ISA三級指令(64位指令). -mcpu=r4000選項必須和-mips2聯用. (譯註:疑爲-mips3)

-mint64

-mlong64

-mlonglong128

這些選項目前不起作用.

-mmips-as

產生用於MIPS彙編器的代碼,同時使用mips-tfile添加普通的調試信息.對於大多數平臺這是 默認選項,除了OSF/1參考平臺,它使用OSF/rose目標格式.如果打開了任一個-ggdb-gstabs,-gstabs+選項開關mips-tfile程序就把stab封裝在MIPS ECOFF裏面.

-mgas

產生用於GNU彙編器的代碼.OSF/1參考平臺上這是默認選項,它使用OSF/rose目標格式.

-mrnames

-mno-rnames

-mrnames開關選項告訴輸出代碼使用MIPS軟件名稱說明寄存器,而不是硬件名稱(就是說,用 a0代替$4). GNU彙編器不支持-mrnames選項,MIPS彙編器則運行MIPS C預處理器處理源文件-mno-rnames是默認選項.

-mgpopt

-mno-gpopt

-mgpopt開關選項要求在正文段中把所有的數據聲明寫到指令前面,使各種MIPS彙編器對短類型全局 或靜態數據項(short global or static data items)輸出單字內存訪問而不是雙字內存訪問.當打開編譯優化 時,這是默認功能.

-mstats

-mno-stats

每次處理完非嵌入函數(non-inline function)-mstats開關選項使編譯器向標準錯誤文件 輸出一行關於程序的統計資料(保存的寄存器數目,堆棧大小,等等).

-mmemcpy

-mno-memcpy

-mmemcpy開關選項使所有的塊移動操作調用適當的string函數(memcpy或 bcopy),而不是生成嵌入代碼.

-mmips-tfile

-mno-mips-tfile

MIPS彙編器生成mips-tfile文件(用於幫助調試)-mno-mips-tfile 開關選項阻止編譯器使用mips-tfile後期處理(postprocess)目標文件.不運行 mips-tfile就沒有調試器關注的局部變量.另外stage2stage3目標文件將把 臨時文件名傳遞給彙編器,嵌在目標文件中,這意味着不比較目標文件是否相同.

-msoft-float

輸出包含浮點庫調用警告所需庫不是GNU CC的一部分.一般說來使用該機型本地C編譯器的相應部件但是不能直接用於交叉編譯,你必須自己安排,提供交叉編譯適用的庫函數.

-mhard-float

輸出包含浮點指令.如果編譯器沒有被改動,這就是默認選項.

-mfp64

編譯器認爲狀態字的FR置位(on),也就是說存在32 64-bit浮點寄存器,而不是32 32-bit 浮點寄存器.同時必須打開-mcpu=r4000-mips3開關.

-mfp32

認爲存在32 32-bit浮點寄存器.這是默認選項.

-mabicalls

-mno-abicalls

輸出(或不輸出.abicalls.cpload,.cprestore僞指令,某些 System V.4版本用於位置無關代碼.

-mhalf-pic

-mno-half-pic

-mhalf-pic開關選項要求把外部引用的指針放到數據段,並且載入內存,而不放到正文段.該選項目前 不起作用.

-G num

把小於等於num字節的全局或靜態數據放到小的數據段或bss,而不是普通的數據段或bss這樣彙編器可以輸出基於全局指針(gp$28),的單字內存訪問指令而非普通的雙字指令.默認情況下MIPS彙編器時num8,GNU彙編器則爲0.另外-Gnum選項也被傳遞 給彙編器和連接器.所有的模塊必須在相同的-Gnum值下編譯.

-nocpp

彙編用戶彙編文件(帶有`.s'後綴),告訴MIPS彙編器不要運行預處理器.

下面的`-m'選項用於Intel 80386族計算機-m486

-mno-486

控制是否生成對486優化的代碼.

-msoft-float

輸出包含浮點庫調用警告所需庫不是GNU CC的一部分.一般說來使用該機型本地C編譯器的相應部件但是不能直接用於交叉編譯,你必須自己安排,提供交叉編譯適用的庫函數.

在函數把浮點返回值放在80387寄存器棧的機器上,即使設置了`-msoft-float'選項,也可能會發出 一些浮點操作碼.

-mno-fp-ret-in-387

不用FPU寄存器返回函數值.

通常函數調用約定把floatdouble的返回值放在FPU寄存器中,即使不存在FPU. 這種作法的理念是操作系統應該仿真出FPU.

`-mno-fp-ret-in-387'選項使浮點值通過普通的CPU寄存器返回.

下面的`-m'選項用於HPPA族計算機:

-mpa-risc-1-0

生成PA 1.0處理器的目標碼.

-mpa-risc-1-1

生成PA 1.1處理器的目標碼.

-mkernel

生成適用於內核的目標碼.特別要避免add指令,它有一個參數是DP寄存器;addil 代替add指令.這樣可以避免HP-UX連接器的某個嚴重bug.

-mshared-libs

生成能夠連接HP-UX共享庫的目標碼.該選項還沒有實現全部功能,PA目標默認爲關閉.使用這個選項會導致 編譯器生成錯誤的目標碼.

-mno-shared-libs

不生成連接HP-UX共享庫的目標碼.這是PA目標的默認選項.

-mlong-calls

生成的目標碼允許同一個源文件中的函數調用,調用點和被調函數的距離可以超過256K之遠.不需要打開這個開關選項除非連接器給出``branch out of range errors``這樣的錯誤.

-mdisable-fpregs

防止任何情況下使用浮點寄存器.編譯內核需要這個選項,內核切換浮點寄存器的執行環境速度非常緩慢.如果打開了這個 開關選項同時試圖浮點操作,編譯將失敗.

-mdisable-indexing

防止編譯器使用索引地址模式(indexing address mode).這樣在MACH上編譯MIG生成的代碼時,可以 避免一些非常晦澀的問題.

-mtrailing-colon

在標記定義(label definition)的末尾添加一個冒號(用於ELF彙編器).

下面的`-m'選項用於Intel 80960族計算機:

-mcpu-type

默認機器類型爲cpu-type ,使編譯器產生對應的指令,地址模式和內存對齊.默認的 cpu-typekb;其他選擇有kamccacfsa,sb.

-mnumerics

-msoft-float

-mnumerics開關選項指出處理器不支持浮點指令-msoft-float開關選項指出不應該認爲 機器支持浮點操作.

-mleaf-procedures

-mno-leaf-procedures

企圖(或防止)改變葉過程(leaf procedure),使其可被bal指令以及call指令 調用.對於直接函數調用,如果bal指令能夠被彙編器或連接器替換,這可以產生更有效的代碼,但是其他情況下 產生較低效的代碼,例如通過函數指針調用函數,或使用了不支持這種優化的連接器.

-mtail-call

-mno-tail-call

執行(或不執行)更多的嘗試(除過編譯器那些機器無關部分),優化進入分支的尾遞歸(tail-recursive)調用.你 可能不需要這個,因爲檢測什麼地方無效沒有全部完成.默認開關是-mno-tail-call.

-mcomplex-addr

-mno-complex-addr

認爲(或不認爲)在當前的i960設備上,值得使用複合地址模式(complex addressing mode).複合地址模式 可能不值得用到K系列,但是一定值得用在C系列.目前除了CBCC處理器,其他處理器上 -mcomplex-addr是默認選項.

-mcode-align

-mno-code-align

把目標碼對齊到8字節邊界上(或者不必),這樣讀取會快一些.目前只對C系列默認打開.

-mic-compat

-mic2.0-compat

-mic3.0-compat

兼容iC960 v2.0v3.0.

-masm-compat

-mintel-asm

兼容iC960彙編器.

-mstrict-align

-mno-strict-align

不允許(或允許)邊界不對齊的訪問.

-mold-align

使結構對齊(structure-alignment)兼容Intelgcc發行版本1.3 (基於gcc 1.37).目前 這個選項有點問題,因爲#pragma align 1總是作同樣的設定,而且無法關掉.

下面的`-m'選項用於DEC Alpha設備:

-mno-soft-float

-msoft-float

使用(或不使用)硬件浮點指令進行浮點運算.打開-msoft-float,將使用 `libgcc1.c'中的函數執行浮點運算.除非它們被仿真浮點操作的例程替換,或者類似,它們被編譯爲調用 仿真例程,這些例程將發出浮點操作.如果你爲不帶浮點操作的Alpha編譯程序,你必須確保建立了這個庫,以便不調用 仿真例程.

注意,不帶浮點操作的Alpha也要求擁有浮點寄存器.

-mfp-reg

-mno-fp-regs

生成使用(或不使用)浮點寄存器羣的目標代碼-mno-fp-regs包含有-msoft-float 開關選項.如果不使用浮點寄存器,浮點操作數就象整數一樣通過整數寄存器傳送,浮點運算結果放到$0而不是$f0.這是非標準 調用,因此任何帶有浮點參數或返回值的函數,如果被-mno-fp-regs開關編譯過的目標碼調用,它也必須 用這個選項編譯.

這個選項的典型用法是建立內核,內核不使用任何浮點寄存器,因此沒必要保存和恢復這些寄存器.

下面附加的選項出現在System V第四版中,用於兼容這些系統中的其他編譯器:

-G

SVr4系統中gcc出於兼容接受了`-G'選項(然後傳遞給連接器).可是我們建議使用 `-symbolic'`-shared'選項,而不在gcc命令行上出現連接選項.

-Qy

驗證編譯器用的工具的版本,輸出到.ident彙編指令.

-Qn

制止輸出端的.ident指令(默認選項).

-YP,dirs

對於`-l'指定的庫文件,只搜索dirs.你可以在dirs中用冒號隔開各個 目錄項.

-Ym,dir

dir目錄中尋找M4預處理器.彙編器使用這個選項.

代碼生成選項(CODE GENERATION OPTION)

下面的選項和平臺無關,用於控制目標碼生成的接口約定.

大部分選項以`-f'開始.這些選項擁有確定和否定兩種格式; `-ffoo'的否定格式是 `-fno-foo'.後面的描述將只列舉其中的一個格式---非默認的格式.你可以通過添加或去掉`no-'推測出另一個格式.

-fnonnull-objects

假設通過引用(reference)取得的對象不爲null (C++).

一般說來, GNU C++對通過引用取得的對象作保守假設.例如,編譯器一定會檢查下似代碼中的a不爲 null:

obj &a = g (); a.f (2);

檢查類似的引用需要額外的代碼,然而對於很多程序是不必要的.如果你的程序不要求這種檢查,你可以用 `-fnonnull-objects'選項忽略它.

-fpcc-struct-return

函數返回structunion值時,採用和本地編譯器相同的參數約定.對於較小的結構這種約定的效率偏低,而且很多機器上不能重入;它的優點是允許GCC編譯的目標碼和PCC編譯的目標碼互相調用.

-freg-struct-return

一有可能就通過寄存器返回structunion函數值.對於較小的結構,它比 -fpcc-struct-return更有效率.

如果既沒有指定-fpcc-struct-return ,也沒有指定-freg-struct-return, GNU CC默認使用目標機的標準約定.如果沒有標準約定, GNU CC默認採用-fpcc-struct-return.

-fshort-enums

enum類型只分配它聲明的值域範圍的字節數.就是說enum類型等於大小足夠的 最小整數類型.

-fshort-double

使double類型的大小和float一樣.

-fshared-data

要求編譯結果的數據和非const變量是共享數據,而不是私有數據.這種差別僅在某些操作系統上面有意義那裏的共享數據在同一個程序的若干進程間共享,而私有數據在每個進程內都有副件.

-fno-common

即使未初始化的全局變量也分配在目標文件的bss,而不是把它們當做普通塊(common block)建立.這樣的 結果是,如果在兩個不同的編譯結果中聲明瞭同一個變量(沒使用extern ),連接它們時會產生錯誤這個選項可能有用的唯一情況是,你希望確認程序能在其他系統上運行,而其他系統總是這麼做.

-fno-ident

忽略`#ident'指令.

-fno-gnu-linker

不要把全局初始化部件(C++的構造子和解構子)輸出爲GNU連接器使用的格式(GNU連接器是標準方法的系統 上).當你打算使用非GNU連接器的時候可以用這個選項,GNU連接器也需要collect2程序確保系統連接器 放入構造子(constructor)和解構子(destructor). (GNU CC的發佈包中包含有collect2 程序.)對於必須使用collect2的系統,編譯器驅動程序gcc自動配置爲這麼做.

-finhibit-size-directive

不要輸出.size彙編指令,或其他類似指令,當某個函數一分爲二,兩部分在內存中距離很遠時會引起問題當編譯`crtstuff.c'時需要這個選項;其他情況下都不應該使用.

-fverbose-asm

輸出彙編代碼時放些額外的註釋信息.這個選項僅用於確實需要閱讀彙編輸出的時候(可能調試編譯器自己的時候).

-fvolatile

使編譯器認爲所有通過指針訪問的內存是易變內存(volatile).

-fvolatile-global

使編譯器認爲所有的外部和全局變量是易變內存.

-fpic

如果支持這種目標機,編譯器就生成位置無關目標碼.適用於共享庫(shared library).

-fPIC

如果支持這種目標機,編譯器就輸出位置無關目標碼.適用於動態連接(dynamic linking),即使分支需要大範圍 轉移.

-ffixed-reg

把名爲reg的寄存器按固定寄存器看待(fixed register);生成的目標碼不應該引用它(除了或許 用作棧指針,幀指針,或其他固定的角色).

reg必須是寄存器的名字.寄存器名字取決於機器,用機器描述宏文件的REGISTER_NAMES宏 定義.

這個選項沒有否定格式,因爲它列出三路選擇.

-fcall-used-reg

把名爲reg的寄存器按可分配寄存器看待,不能在函數調用間使用.可以臨時使用或當做變量使用,生存期 不超過一個函數.這樣編譯的函數無需保存和恢復reg寄存器.

如果在可執行模塊中,把這個選項說明的寄存器用作固定角色將會產生災難性結果,如棧指針或幀指針.

這個選項沒有否定格式,因爲它列出三路選擇.

-fcall-saved-reg

把名爲reg的寄存器按函數保護的可分配寄存器看待.可以臨時使用或當做變量使用,它甚至能在函數間 生存.這樣編譯的函數會保存和恢復使用中的reg寄存器.

如果在可執行模塊中,把這個選項說明的寄存器用作固定角色將會產生災難性結果,如棧指針或幀指針.

另一種災難是用這個選項說明的寄存器返回函數值.

這個選項沒有否定格式,因爲它列出三路選擇.

PRAGMAS

GNU C++支持兩條`#pragma'指令使同一個頭文件有兩個用途:對象類的接口定義對象類完整的內容定義.

#pragma interface

(僅對C++)在定義對象類的頭文件中,使用這個指令可以節省大部分採用該類的目標文件的大小.一般說來,某些信息 (內嵌成員函數的備份副件,調試信息,實現虛函數的內部表格等)的本地副件必須保存在包含類定義的各個目標文件中.使用這個 pragma指令能夠避免這樣的複製.當編譯中引用包含`#pragma interface'指令的頭文件時,就 不會產生這些輔助信息(除非輸入的主文件使用了`#pragma implementation'指令).作爲替代,目標文件 將包含可被連接時解析的引用(reference).

#pragma implementation

#pragma implementation "objects.h"

(僅對C++)如果要求從頭文件產生完整的輸出(並且全局可見),你應該在主輸入文件中使用這條pragma.頭文件 中應該依次使用`#pragma interface'指令.implementation文件中將產生全部內嵌成員函數 的備份,調試信息,實現虛函數的內部表格等.

如果`#pragma implementation'不帶參數,它指的是和源文件有相同基本名的包含文件;例如, `allclass.cc', `#pragma implementation'等於`#pragma implementation allclass.h'.如果某個implementation文件需要從多個頭文件引入代碼,就應該 使用這個字符串參數.

不可能把一個頭文件裏面的內容分割到多個implementation文件中.

文件(FILE)

file.c             C源文件

file.h             C頭文件(預處理文件)

file.i            預處理後的C源文件

file.C             C++源文件

file.cc            C++源文件

file.cxx           C++源文件

file.m             Objective-C源文件

file.s            彙編語言文件

file.o            目標文件

a.out             連接的輸出文件

TMPDIR/cc*        臨時文件

LIBDIR/cpp        預處理器

LIBDIR/cc1         C編譯器

LIBDIR/cc1plus     C++編譯器

LIBDIR/collect    某些機器需要的連接器前端(front end)程序

LIBDIR/libgcc.a    GCC子例程(subroutine)

/lib/crt[01n].o   啓動例程(start-up)

LIBDIR/ccrt0       C++的附加啓動例程

/lib/libc.a       標準C,另見intro (3)

/usr/include       #include文件的標準目錄

LIBDIR/include     #include文件的標準gcc目錄

LIBDIR/g++-include #include文件的附加g++目錄

 

 

LIBDIR通常爲/usr/local/lib/machine/version
TMPDIR
來自環境變量TMPDIR (如果存在,缺省爲/usr/tmp ,否則爲 /tmp).

 

BUGS

關於報告差錯的指導請查閱GCC手冊.

版權(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.

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