<摘錄>GCC 中文手

木子你妹發表於2014-04-10

GCC 中文手冊 作者:徐明

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)

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

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

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

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

描述(DESCRIPTION)

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

gcc

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

g++

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

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

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

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

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

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

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

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

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

s 組合語言源程式;彙編

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

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

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

o 目標檔案(Object file)

a 歸檔庫檔案(Archive file)

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

選項(OPTIONS)

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

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

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

總體選項(Overall Option)

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

語言選項(Language Option)

-ansi -fall-virtual -fcond-mismatch -fdollars-in-identifiers -fenum-int-
equiv -fexternal-templates -fno-asm -fno-builtin -fhosted -fno-hosted -f
freestanding -fno-freestanding -fno-strict-prototype -fsigned-bitfields
-fsigned-char -fthis-is-variable -funsigned-bitfields -funsigned-char -f
writable-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 -Wimplic
it-function-declaration -Winline -Wlong-long -Wmain -Wmissing-prototypes
-Wmissing-declarations -Wnested-externs -Wno-import -Wparentheses -Wpoi
nter-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=libr
ary -print-libgcc-file-name -print-prog-name=program

優化選項(Optimization Option)

-fcaller-saves -fcse-follow-jumps -fcse-skip-blocks -fdelayed-branch -fe
lide-constructors -fexpensive-optimizations -ffast-math -ffloat-store -f
force-addr -fforce-mem -finline-functions -fkeep-inline-functions -fmemo
ize-lookups -fno-default-inline -fno-defer-pop -fno-function-cse -fno-in
line -fno-peephole -fomit-frame-pointer -frerun-cse-after-loop -fschedul
e-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 -nostd
inc -P -Umacro -undef

彙編器選項(Assembler Option)

-Wa,option

聯結器選項(Linker Option)

-llibrary -nostartfiles -nostdlib -static -shared -symbolic -Xlinker opt
ion -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 -mspar
clite -mv8 -msupersparc -mcypress

Convex選項

-margcount -mc1 -mc2 -mnoargcount

AMD29K選項

-m29000 -m29050 -mbw -mdw -mkernel-registers -mlarge -mnbw -mnodw -msmal
l -mstack-check -muser-registers

M88K選項

-m88000 -m88100 -m88110 -mbig-pic -mcheck-zero-division -mhandle-large-s
hift -midentify-revision -mno-check-zero-division -mno-ocs-debug-info -m
no-ocs-frame-position -mno-optimize-arg-area -mno-serialize-volatile -mn
o-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 -mh
c-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 -m
no-mips-tfile -mmips-tfile -msoft-float -mhard-float -mabicalls -mno-abi
calls -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 -mlo
ng-calls -mdisable-fpregs -mdisable-indexing -mtrailing-colon

i960選項

-mcpu-type -mnumerics -msoft-float -mleaf-procedures -mno-leaf-procedure
s -mtail-call -mno-tail-call -mcomplex-addr -mno-complex-addr -mcode-ali
gn -mno-code-align -mic-compat -mic2.0-compat -mic3.0-compat -masm-compa
t -mintel-asm -mstrict-align -mno-strict-align -mold-align -mno-old-alig
n

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 -f
nonnull-objects -fno-common -fno-ident -fno-gnu-linker -fpcc-struct-retu
rn -fpic -fPIC -freg-struct-return -fshared-data -fshort-enums -fshort-d
ouble -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.suffi
x '的目標檔案是`source.o',彙編檔案是 `source.s',而預處理後的C原始碼送往標
準輸出.

-v

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

-pipe

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


語言選項(LANGUAGE OPTIONS)

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

-ansi

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

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

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

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

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

-fno-asm

不把asm, inline或typeof當作關鍵字,因此這些詞可以用做識別符號.用 __asm__, _
_inline__和__typeof__能夠替代他們. `-ansi' 隱含宣告瞭`-fno-asm'.

-fno-builtin

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

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

-fhosted

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


-ffreestanding

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


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

-fno-strict-prototype

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

-trigraphs

支援ANSI C trigraphs. `-ansi'選項隱含宣告瞭`-trigraphs'.

-traditional

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

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

-traditional-cpp

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

-fdollars-in-identifiers

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

-fenum-int-equiv

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

-fexternal-templates

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

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

-fall-virtual

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

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

-fcond-mismatch

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

-fthis-is-variable

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

-funsigned-char

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

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


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

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

-fsigned-char

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

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

-fsigned-bitfields

-funsigned-bitfields

-fno-signed-bitfields

-fno-unsigned-bitfields

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

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

-fwritable-strings

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

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



前處理器選項(Preprocessor Option)

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

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

-include file

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

-imacros file

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

-idirafter dir

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

-iprefix prefix

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

-iwithprefix dir

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

-nostdinc

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

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


-nostdinc++

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

-undef

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

-E

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


-C

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

-P

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

-M [ -MG ]

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

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

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

-MM [ -MG ]

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

-MD

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

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


-MMD

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

-H

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

-Aquestion(answer)

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

-Dmacro

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

-Dmacro=defn

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

-Umacro

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

-dM

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

-dD

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

-dN

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



彙編器選項(ASSEMBLER OPTION)

-Wa,option

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



聯結器選項(LINKER OPTION)

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

object-file-name

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

-llibrary

連線名為library的庫檔案.

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

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

一般說來用這個方法找到的檔案是庫檔案---即由目標檔案組成的歸檔檔案(archiv
e 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 -asse
rt -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當作欲執行的程式的 字首,既可以包括也可以不包括`ma
chine/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'不會產生警告資訊. Pedant
ic 也不警告跟在__extension__後面的表示式.不過只應該在系統標頭檔案中使用這種
轉義措施,應用程式最好 避免.

-pedantic-errors

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

-W

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

*

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

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

*

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

foo (a)

{

if (a > 0)

return a;

}

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

*

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

*

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

-Wimplicit-int

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

-Wimplicit-function-declaration

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

-Wimplicit

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

-Wmain

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

-Wreturn-type

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

-Wunused

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

-Wswitch

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

-Wcomment

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

-Wtrigraphs

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

-Wformat

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

-Wchar-subscripts

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

-Wuninitialized

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

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

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

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

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

{

int x;

switch (y)

{

case 1: x = 1;

break;

case 2: x = 4;

break;

case 3: x = 5;

}

foo (x);

}

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

{

int save_y;

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

...

if (change_y) y = save_y;

}

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

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

-Wparentheses

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

-Wtemplate-debugging

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

-Wall

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

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

-Wtraditional

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

*

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

*

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

*

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

-Wshadow

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

-Wid-clash-len

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

-Wpointer-arith

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

-Wcast-qual

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

-Wcast-align

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

-Wwrite-strings

規定字串常量的型別是const char[length],因此,把這樣的地址複製給 non-con
st 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-functi
ons 選項,編譯器都將發出警告.

-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:func
tionname'來澄清. `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'選項將被 開啟.在有del
ay 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

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

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

-fmemoize-lookups

-fsave-memoized

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

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

cout << "This " << p << " has " << n << " legs.\n";

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

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

-fno-default-inline

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

-fno-defer-pop

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

-fforce-mem

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

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

-fomit-frame-pointer

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

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

-finline-functions

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

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

-fcaller-saves

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

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

-fkeep-inline-functions

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

-fno-function-cse

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

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

-fno-peephole

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

-ffast-math

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

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

下列選項控制特定的優化. `-O2'選項開啟下面的大多數優化項,除了`-funroll-lo
ops'和 `-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-bloc
ks'選項將導致CSE跟在if產生的跳轉後面.

-frerun-cse-after-loop

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

-felide-constructors

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

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

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

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

-fexpensive-optimizations

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

-fdelayed-branch

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

-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的組成部分.一般說來GC
C使用該機型本地C 編譯器的相應部件,但是作交叉編譯時卻不能直接使用.你必須自
己管理提供合適的函式庫用於交叉編譯.

-mshort

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

-mnobitfield

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

-mbitfield

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

-mrtd

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


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

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

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

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

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

-munix

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

-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, 100
0 和2000系列使用這種晶片.同時該選項啟用完整的SPARC v8指令集.

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

-mc1

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

-mc2

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

-margcount

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

-mnoargcount

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

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

-mdw

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

-mnodw

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

-mbw

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

-mnbw

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


-msmall

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

-mlarge

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

-m29050

輸出Am29050的目標碼.

-m29000

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

-mkernel-registers

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

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

-muser-registers

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

-mstack-check

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

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

-m88000

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

-m88100

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

-m88110

生成的目標碼在m88110上工作的最好,可能不能在m88100上執行.

-midentify-revision

在彙編器的輸出端包含一條ident指令,記錄原始檔名,編譯器名字和版本,時標,以及
使用的編譯選項,

-mno-underscores

在彙編器的輸出端,符號名字前面不新增下劃線.預設情況是在每個名字前面增加下
劃線字首.

-mno-check-zero-division

-mcheck-zero-division

早期型號的88K系統在除零操作上存在問題,特定情況下許多機器無法自陷.使用這些
選項可以避免包含(或可以 顯明包含)附加的程式碼,這些程式碼能夠檢查除零錯,傳送例
外訊號. GCC所有88K的配置預設使用 `-mcheck-zero-division'選項.

-mocs-debug-info

-mno-ocs-debug-info

包含(或忽略)附加的除錯資訊(關於每個棧架結構中暫存器的使用), 88Open Objec
t Compatibility Standard, ``OCS'',對此資訊做了說明. GDB不需要這些額外資訊
DG/UX, SVr4,和Delta 88 SVr3.2的預設配置是包含除錯資訊,其他88k機型的預設
配置是忽略這個資訊.

-mocs-frame-position

-mno-ocs-frame-position

強制(或不要求)把暫存器值儲存到棧架結構中的指定位置(按OCS的說明). DG/UX,
Delta88 SVr3.2和 BCS的預設配置使用`-mocs-frame-position'選項;其他88k機型
的預設配置是 `-mno-ocs-frame-position'.

-moptimize-arg-area

-mno-optimize-arg-area

控制如何在堆疊結構中儲存函式引數. `-moptimize-arg-area'節省空間,但是有可
能宕掉某些 偵錯程式(不是GDB). `-mno-optimize-arg-area'證實比標準選項好.預設
情況下GCC不優化引數域.

-mshort-data-

num通過和r0關聯,產生較小的資料引用(data reference),這樣就可以用單指令調入
一個數值(而不是平常的雙指令).使用者通過選項中的num控制改變哪種資料引用.例
如,如果你指定了 `-mshort-data-512',那麼受影響的資料引用是小於512位元組的數
據移動. -mshort-data-num選項對大於64K的num 無效.

-mserialize-volatile

-mno-serialize-volatile

產生,或不產生程式碼來保證對易變記憶體訪問的結果一致.

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

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

m88110處理器的記憶體引用順序並不始終符合指令請求的引用順序.特別是某條讀取指
令可能在先前的儲存指令之前執行. 多處理器環境下,亂序訪問擾亂了易變記憶體訪問
的結果一致.因此當使用`-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或 re
al-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.h和stdargs.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是 defa
ult, GCC將選取任何機型上都是最長週期時間的指令,這樣才能使程式碼在所有的MIP
S處理器上以合理 的速度執行. cpu-type的其他選擇是r2000, r3000, r4000,和 r
6000.雖然選定某個cpu-type後, GCC將針對選定的晶片安排對應的工作,但是如果
不指定?? -mips2或-mips3選項,編譯器不會輸出任何不符合MIPS ISA (instructio
n 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 EC
OFF裡面.

-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就
沒有偵錯程式關注的區域性變數.另外, stage2和stage3目標檔案將把 臨時檔名傳遞
給彙編器,嵌在目標檔案中,這意味著不比較目標檔案是否相同.

-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或$2,的單字記憶體訪問指令而非普
通的雙字指令.預設情況下, 用MIPS彙編器時num是8,而GNU彙編器則為0.另外, -Gn
um選項也被傳遞 給彙編器和聯結器.所有的模組必須在相同的-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暫存器返回函式值.

通常函式呼叫約定把float和double的返回值放在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

生成的目標碼允許同一個原始檔中的函式呼叫,呼叫點和被調函式的距離可以超過2
56K之遠.不需要開啟這個開關選項, 除非聯結器給出``branch out of range erro
rs``這樣的錯誤.

-mdisable-fpregs

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

-mdisable-indexing

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

-mtrailing-colon

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

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

-mcpu-type

預設機器型別為cpu-type ,使編譯器產生對應的指令,地址模式和記憶體對齊.預設的
cpu-type是kb;其他選擇有ka, mc, ca, cf, sa,和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系列.目前除了CB
和CC處理器,其他處理器上 -mcomplex-addr是預設選項.

-mcode-align

-mno-code-align

把目標碼對齊到8位元組邊界上(或者不必),這樣讀取會快一些.目前只對C系列預設打
開.

-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

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


下面的`-m'選項用於DEC Alpha裝置:

-mno-soft-float

-msoft-float

使用(或不使用)硬體浮點指令進行浮點運算.開啟-msoft-float時,將使用 `libgcc
1.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

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

-freg-struct-return

一有可能就通過暫存器返回struct和union函式值.對於較小的結構,它比 -fpcc-st
ruct-return更有效率.

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

-fshort-enums

給enum型別只分配它宣告的值域範圍的位元組數.就是說, enum型別等於大小足夠的
最小整數型別.

-fshort-double

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

-fshared-data

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

-fno-common

即使未初始化的全域性變數也分配在目標檔案的bss段,而不是把它們當做普通塊(com
mon block)建立.這樣的 結果是,如果在兩個不同的編譯結果中宣告瞭同一個變數(
沒使用extern ),連線它們時會產生錯誤. 這個選項可能有用的唯一情況是,你希望
確認程式能在其他系統上執行,而其他系統總是這麼做.

-fno-ident

忽略`#ident'指令.

-fno-gnu-linker

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

-finhibit-size-directive

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

-fverbose-asm

輸出彙編程式碼時放些額外的註釋資訊.這個選項僅用於確實需要閱讀彙編輸出的時候
(可能除錯編譯器自己的時候).

-fvolatile

使編譯器認為所有通過指標訪問的記憶體是易變記憶體(volatile).

-fvolatile-global

使編譯器認為所有的外部和全域性變數是易變記憶體.

-fpic

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

-fPIC

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

-ffixed-reg

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

reg必須是暫存器的名字.暫存器名字取決於機器,用機器描述巨集檔案的REGISTER_NA
MES巨集 定義.

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

-fcall-used-reg

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


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

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

-fcall-saved-reg

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

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

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

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



PRAGMAS

GNU C++支援兩條`#pragma'指令使同一個標頭檔案有兩個用途:物件類的介面定義, 對
象類完整的內容定義.

#pragma interface

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

#pragma implementation

#pragma implementation "objects.h"

(僅對C++)如果要求從標頭檔案產生完整的輸出(並且全域性可見),你應該在主輸入檔案
中使用這條pragma.標頭檔案 中應該依次使用`#pragma interface'指令.在implemen
tation檔案中將產生全部內嵌成員函式 的備份,除錯資訊,實現虛擬函式的內部表格等


如果`#pragma implementation'不帶引數,它指的是和原始檔有相同基本名的包含文
件;例如, `allclass.cc'中, `#pragma implementation'等於`#pragma implement
ation 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

相關文章