gcc g++ 參數介紹


C和C++ 編譯器是集成的.他們都要用四個步驟中的一個或多個處理輸入文件: 預處理 (preprocessing),編譯(compilation),匯編(assembly)和連接(linking).源文件后綴名標識源文
件的 語言,但是對編譯器來說,后綴名控制着缺省設定: 
gcc  認為預處理后的文件(.i)是C文件,並且設定C形式的連接. 
g++  認為預處理后的文件(.i)是C++ 文件,並且設定C++ 形式的連接. 

源文件后綴名指出語言種類以及后期的操作: 
.c      C源程序;預處理,編譯,匯編
.C      C++源程序;預處理,編譯,匯編
.cc      C++ 源程序;預處理,編譯,匯編
.cxx    C++源程序;預處理,編譯,匯編
.m      Objective-C源程序;預處理,編譯,匯編
.i     預處理后的C文件;編譯,匯編
.ii     預處理后的C++ 文件;編譯,匯編
.s     匯編語言源程序;匯編
.S     匯編語言源程序;預處理,匯編
.h     預處理器文件;通常不出現在命令行上
  
其他后綴名的文件被傳遞給連接器(linker).通常包括: 
.o     目標文件(Object file)
.a     歸檔庫文件(Archive file)
 
除非使用了-c, -S,或-E選項(或者編譯錯誤阻止了完整的過程),否則連接總是 最后的步驟.在連接階段中,所有對應於源程序的.o文件, -l庫文件,無法識別的文件名(包括指定的 .o目標文件和.a庫文件)按命
令行中的順序傳遞給連接器.

選項(OPTIONS)
選項必須分立給出: ` -dr '完全不同於`-d -r '.  
大多數`-f'和`-W'選項有兩個相反的格式: -fname和 -fno-name (或-Wname和-Wno-name).這里 只列舉不是默認選項的格式. 下面是所有選項的摘要,按類型分組,解釋放在后面的章節中. 
 
總體選項(Overall Option)  
-c -S -E -o file -pipe -v -x  language  
 
語言選項(Language Option) 
-ansi -fall-virtual -fcond-mismatch -fdollars-in-identifiers -fenum-int-equiv -fexternal-templates -fno-asm -fno-builtin -fhosted -fno-hosted -ffreestanding -fno-freestanding -fno-strict-prototype -fsigned-bitfields -fsigned-char -fthis-is-variable -funsigned-bitfields -funsigned-char -fwritable-strings -traditional -traditional-cpp -trigraphs 
 
警告選項(Warning Option) 
-fsyntax-only -pedantic -pedantic-errors -w -W -Wall -Waggregate-return 
-Wcast-align -Wcast-qual -Wchar-subscript -Wcomment -Wconversion -Wenum-clash -Werror -Wformat -Wid-clash-len  -Wimplicit -Wimplicit-int -Wimplicit-function-declaration -Winline -Wlong-long -Wmain -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -Wno-import -Wparentheses -Wpointer-arith -Wredundant-decls -Wreturn-type -Wshadow -Wstrict-prototypes -Wswitch -Wtemplate-debugging -Wtraditional -Wtrigraphs -Wuninitialized -Wunused -Wwrite-strings 
 
調試選項(Debugging Option)  
-a -dletters -fpretend-float -g -glevel -gcoff -gxcoff -gxcoff+ -gdwarf 
-gdwarf+ -gstabs -gstabs+ -ggdb -p -pg -save-temps -print-file-name=library -print-libgcc-file-name -print-prog-name=program 
 
優化選項(Optimization Option) 
-fcaller-saves -fcse-follow-jumps -fcse-skip-blocks -fdelayed-branch -felide-constructors -fexpensive-optimizations -ffast-math -ffloat-store 
-fforce-addr -fforce-mem -finline-functions -fkeep-inline-functions -fmemoize-lookups -fno-default-inline -fno-defer-pop -fno-function-cse -fno-inline -fno-peephole -fomit-frame-pointer -frerun-cse-after-loop -fschedule-insns -fschedule-insns2 -fstrength-reduce -fthread-jumps -funroll-all-loops -funroll-loops -O -O2 -O3  
 
預處理器選項(Preprocessor Option) 
-Aassertion -C -dD -dM -dN -D macro[=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 -I dir  -I- -Ldir  
 
目標機選項(Target Option) 
-b  machine -V version 
 
配置相關選項(Configuration Dependent Option) 
M680x0 選項  
-m68000 -m68020 -m68020-40 -m68030 -m68040 -m68881 -mbitfield -mc68000 -mc68020 -mfpa -mnobitfield -mrtd -mshort -msoft-float  
VAX 選項  
-mg -mgnu -munix 
SPARC選項  
-mepilogue -mfpu -mhard-float -mno-fpu -mno-epilogue -msoft-float -msparclite -mv8 -msupersparc -mcypress  
Convex選項  
-margcount -mc1 -mc2 -mnoargcount  
AMD29K選項  
-m29000 -m29050 -mbw -mdw -mkernel-registers -mlarge -mnbw -mnodw -msmall -mstack-check -muser-registers 
M88K選項  
-m88000 -m88100 -m88110 -mbig-pic -mcheck-zero-division -mhandle-large-shift -midentify-revision -mno-check-zero-division -mno-ocs-debug-info -mno-ocs-frame-position -mno-optimize-arg-area -mno-serialize-volatile -mno-underscores -mocs-debug-info -mocs-frame-position -moptimize-arg-area -mserialize-volatile -mshort-data-num  -msvr3 -msvr4 -mtrap-large-shift -muse-div-instruction -mversion-03.00 -mwarn-passed-structs  
RS6000選項  
-mfp-in-toc -mno-fop-in-toc 
RT選項  
-mcall-lib-mul -mfp-arg-in-fpregs -mfp-arg-in-gregs -mfull-fp-blocks -mhc-struct-return -min-line-mul -mminimum-fp-blocks -mnohc-struct-return 
MIPS選項  
-mcpu=cpu type  -mips2 -mips3 -mint64 -mlong64 -mmips-as -mgas -mrnames -mno-rnames -mgpopt -mno-gpopt -mstats -mno-stats -mmemcpy -mno-memcpy -mno-mips-tfile -mmips-tfile -msoft-float -mhard-float -mabicalls -mno-abicalls -mhalf-pic -mno-half-pic -G num  -nocpp
i386選項  
-m486 -mno-486 -msoft-float -mno-fp-ret-in-387 
HPPA選項  
-mpa-risc-1-0 -mpa-risc-1-1 -mkernel -mshared-libs -mno-shared-libs -mlong-calls -mdisable-fpregs -mdisable-indexing -mtrailing-colon 
i960選項  
-mcpu-type  -mnumerics -msoft-float -mleaf-procedures -mno-leaf-procedures -mtail-call -mno-tail-call -mcomplex-addr -mno-complex-addr -mcode-align -mno-code-align -mic-compat -mic2.0-compat -mic3.0-compat -masm-compat -mintel-asm -mstrict-align -mno-strict-align -mold-align -mno-old-align  
DEC Alpha選項  
-mfp-regs -mno-fp-regs -mno-soft-float -msoft-float 
System V 選項  
-G -Qy -Qn -YP,paths -Ym,dir  
 
代碼生成選項(Code Generation Option) 
-fcall-saved- reg  -fcall-used- reg  -ffixed-reg  -finhibit-size-directive -fnonnull-objects -fno-common -fno-ident -fno-gnu-linker -fpcc-struct-return -fpic -fPIC -freg-struct-return -fshared-data -fshort-enums -fshort-double -fvolatile -fvolatile-global -fverbose-asm 
  
總體選項(Overall Option)
-x  language  
明確指出后面輸入文件的語言為language  (而不是從文件名后綴得到的默認選擇).這個選項應用
於后面 所有的輸入文件,直到遇着下一個`-x'選項. language 的可選值有`c', `objective-c', `c-header ', `c++ ', `cpp-output', `assembler',和`assembler-with-cpp '. 
-x none 
關閉任何對語種的明確說明,因此依據文件名后綴處理后面的文件(就象是從未使用過`-x'選項). 
如果只操作四個階段(預處理,編譯,匯編,連接)中的一部分,可以使用`-x'選項(或文件名后綴)告訴 gcc 從
哪里開始,用`-c', `-S',或`-E'選項告訴gcc 到 哪里結束.注意,某些選項組合(例如, ` -x cpp-output -E')使gcc 不作任何事情. 
-c 
編譯或匯編源文件,但是不作連接.編譯器輸出對應於源文件的目標文件. 
缺省情況下, GCC通過用`.o'替換源文件名后綴`.c', `.i', `.s',等等,產生目標文件名.可
以使用-o選項選擇其他名字. 
GCC 忽略-c選項后面任何無法識別的輸入文件(他們不需要編譯或匯編). 
-S 
編譯后即停止,不進行匯編.對於每個輸入的非匯編語言文件,輸出文件是匯編語言文件. 
缺省情況下, GCC通過用`.o'替換源文件名后綴`.c', `.i',等等,產生 目標文件名.可以使用-o
選項選擇其他名字. 
GCC 忽略任何不需要編譯的輸入文件. 
-E 
預處理后即停止,不進行編譯.預處理后的代碼送往標准輸出. GCC 忽略任何不需要預處理的輸入文件. 
-o  file 
指定輸出文件為file.該選項不在乎GCC 產生什么輸出,無論是可執行文件,目標文件,匯編文件還是 預處理后的C代碼. 
由於只能指定一個輸出文件,因此編譯多個輸入文件時,使用`-o'選項沒有意義,除非輸出一個可執行文件. 
如果沒有使用`-o'選項,默認的輸出結果是:可執行文件為`a.out', `source.suffix '的目標
文件是`source.o',匯編文件是 `source.s',而預處理后的C源代碼送往標准輸出. 
-v 
(在標准錯誤)顯示執行編譯階段的命令.同時顯示編譯器驅動程序,預處理器,編譯器的版本號. 
-pipe 
在編譯過程的不同階段間使用管道而非臨時文件進行通信.這個選項在某些系統上無法工作,因為那
些系統的 匯編器不能從管道讀取數據. GNU的匯編器沒有這個問題. 
語言選項(LANGUAGE OPTIONS)
下列選項控制編譯器能夠接受的C " 方言": 
-ansi 
支持符合ANSI標准的C程序. 
這樣就會關閉GNU C中某些不兼容ANSI C的特性,例如asm , inline和 typeof關鍵字,以及諸如
unix和vax 這些表明當前系統類型的預定義宏.同時開啟 不受歡迎和極少使用的ANSI trigraph
特性,以及禁止`$'成為標識符的一部分. 
盡管使用了`-ansi'選項,下面這些可選的關鍵字, __asm__, __extension__ , __inline__
和__typeof__仍然有效.你當然不會把 他們用在ANSI C程序中,但可以把他們放在頭文件里,因為
編譯包含這些頭文件的程序時,可能會指定 `-ansi'選項.另外一些預定義宏,如__unix__ 和
__vax__,無論有沒有使用 `-ansi'選項,始終有效. 
使用`-ansi'選項不會自動拒絕編譯非ANSI程序,除非增加`-pedantic'選項作為 `-ansi'選項的補充. 
使用`-ansi'選項的時候,預處理器會預定義一個__STRICT_ANSI__宏.有些頭文件 關注此宏,以
避免聲明某些函數,或者避免定義某些宏,這些函數和宏不被ANSI標准調用;這樣就不會干擾在其他
地方 使用這些名字的程序了. 
-fno-asm  
不把asm , inline或typeof當作關鍵字,因此這些詞可以用做標識符.用 __asm__, 
__inline__和__typeof__能夠替代他們. ` -ansi' 隱含聲明了`-fno-asm '. 
-fno-builtin 
不接受不是兩個下划線開頭的內建函數(built-in function).目前受影響的函數有_exit, 
abort, abs , alloca, cos , exit, fabs, labs, memcmp, memcpy, sin , sqrt, 
strcmp, strcpy,和strlen. 
`-ansi'選項能夠阻止alloca和_exit成為內建函數. 
-fhosted  
按宿主環境編譯;他隱含聲明了`-fbuiltin'選項,而且警告不正確的main函數聲明. 
-ffreestanding 
按獨立環境編譯;他隱含聲明了`-fno-builtin'選項,而且對main函數沒有特別要求. 
(譯注:宿主環境(hosted environment)下所有的標准庫可用, main函數返回一個int 值,典型
例子是除了 內核以外幾乎所有的程序.對應的獨立環境(freestanding environment)不存在標
准庫,程序入口也不一定是 main,最明顯的例子就是操作系統內核.詳情參考gcc 網站最近的資料) 
-fno-strict-prototype 
對於沒有參數的函數聲明,例如`int foo ();',按C風格處理--- 即不說明參數個數或類型. ( 僅
針對C++).正常情況下,這樣的函數foo 在C++ 中意味着參數為空. 
-trigraphs 
支持ANSI C trigraphs. `-ansi'選項隱含聲明了`-trigraphs'. 
-traditional 
試圖支持傳統C編譯器的某些方面.詳見GNU C手冊,我們已經把細節清單從這里刪除,這樣當內容過時后,人們也不會 埋怨我們. 
除了一件事:對於C++ 程序(不是C), `-traditional'選項帶來一個附加效應,允許對 this賦值.
他和`-fthis-is-variable '選項的效果一樣. 
-traditional-cpp 
試圖支持傳統C預處理器的某些方面.特別是上面提到有關預處理器的內容,但是不包括 `-traditional'選項的其他效應. 
-fdollars-in-identifiers 
允許在標識符(identifier)中使用`$'字符(僅針對C++).你可以指定 `-fno-dollars-in-identifiers'選項顯明禁止使用`$'符. (GNU C++在某些 目標系統缺省允許`$'符,但不是所有
系統.) 
-fenum-int-equiv 
允許int 類型到枚舉類型(enumeration) 的隱式轉換(僅限於C++).正常情況下GNU C++允許從 
enum到int 的轉換,反之則不行. 
-fexternal-templates 
為模板聲明(template declaration)產生較小的代碼(僅限於C++),方法是對於每個模板函數 
(template function),只在定義他們的地方生成一個副本.想要成功使用這個選項,你必須在所
有使用模板的 文件中,標記`#pragma implementation' ( 定義)或`#pragma 
interface' ( 聲明). 
當程序用`-fexternal-templates'編譯時,模板實例(template instantiation) 全部是
外部類型.你必須讓需要的實例在實現文件中出現.可以通過typedef實現這一點,他引用所需的每
個 實例.相對應的,如果編譯時使用缺省選項`-fno-external-templates ',所有模板實例明確
的設為內置. 
-fall-virtual  
所有可能的成員函數默認為虛函數.所有的成員函數(除了構造子函數和new 或delete 成員操作
符)視為所在類的虛函數. 
這不表明每次調用成員函數都將通過內部虛函數表.有些情況下,編譯器能夠判斷出可以直接調用某
個虛函數;這時就 直接調用.
-fcond-mismatch 
允許條件表達式的第二和第三個參數的類型不匹配.這種表達式的值是void. 
-fthis-is-variable  
允許對this賦值(僅對C++).合並用戶自定義的自由存儲管理機制到C++ 后,使可賦值的 `this'顯
得不合時宜.因此,默認情況下,類成員函數內部對this賦值是無效操作.然而為了 向后兼容,你可以
通過`-fthis-is-variable '選項使這種操作有效. 
-funsigned-char 
把char定義為無符號類型,如同unsigned char . 
各種機器都有自己缺省的char類型.既可能是unsigned char 也可能是signed char . 
理想情況下,當依賴於數據的符號性時,一個可移植程序總是應該使用signed char或unsigned 
char.但是許多程序已經寫成只用簡單的char,並且期待這是有符號數(或者無符號數,具體情況取
決於 編寫程序的目標機器).這個選項,和它的反義選項,使那樣的程序工作在對應的默認值上. 
char的類型始終應該明確定義為signed char或unsigned char ,即使 它表現的和其中之一完全
一樣. 
-fsigned-char  
把char定義為有符號類型,如同signed char. 
這個選項等同於`-fno-unsigned-char ',他是the negative form of `-funsigned-char'的相反選項.同樣, ` -fno-signed-char'等價於 `-funsigned-char'. 
-fsigned-bitfields  
-funsigned-bitfields 
-fno-signed-bitfields 
-fno-unsigned-bitfields  
如果沒有明確聲明`signed'或`unsigned '修飾符,這些選項用來定義有符號位域 (bitfield)或
無符號位域.缺省情況下,位域是有符號的,因為他們繼承的基本整數類型,如int ,是 有符號數. 
然而,如果指定了`-traditional'選項,位域永遠是無符號數. 
-fwritable-strings  
把字符串常量存儲到可寫數據段,而且不做特別對待.這是為了兼容一些老程序,他們假設字符串常
量是可寫的. ` -traditional'選項也有相同效果. 
篡改字符串常量是一個非常糟糕的想法; ``常量''就應該是常量. 
  
預處理器選項(Preprocessor Option)
下列選項針對C預處理器,預處理器用在正式編譯以前,對C 源文件進行某種處理. 
如果指定了`-E'選項, GCC只進行預處理工作.下面的某些選項必須和`-E'選項一起才 有意義,因為他們的
輸出結果不能用於編譯. 
-include file 
在處理常規輸入文件之前,首先處理文件file,其結果是,文件file的內容先得到編譯. 命令行上
任何`-D'和`-U'選項永遠在`-include file'之前處理, 無論他們在命令行上的順序如何.然而
`-include '和`-imacros '選項按書寫順序處理. 
-imacros file 
在處理常規輸入文件之前,首先處理文件file,但是忽略輸出結果.由於丟棄了文件file的 輸出內
容, ` -imacros file'選項的唯一效果就是使文件file中的宏定義生效, 可以用於其他輸入文
件.在處理`-imacros file'選項之前,預處理器首先處理`-D' 和`-U'選項,並不在乎他們在命令
行上的順序.然而`-include '和 `-imacros '選項按書寫順序處理. 
-idirafter dir  
把目錄dir 添加到第二包含路徑中.如果某個頭文件在主包含路徑(用`-I'添加的路徑)中沒有 找
到,預處理器就搜索第二包含路徑. 
-iprefix prefix 
指定prefix作為后續`-iwithprefix'選項的前綴. 
-iwithprefix  dir  
把目錄添加到第二包含路徑中.目錄名由prefix和dir 合並而成,這里 prefix被先前的iprefix'選項指定. 
-nostdinc 
不要在標准系統目錄中尋找頭文件.只搜索`-I'選項指定的目錄(以及當前目錄,如果合適). 
結合使用`-nostdinc'和`-I- '選項,你可以把包含文件搜索限制在顯式指定的目錄. 
-nostdinc++ 
不要在C++ 專用標准目錄中尋找頭文件,但是仍然搜索其他標准目錄. ( 當建立`libg++'時使用 這
個選項.) 
-undef 
不要預定義任何非標准宏. ( 包括系統結構標志). 
-E 
僅運行C預處理器.預處理所有指定的C源文件,結果送往標准輸出或指定的輸出文件. 
-C 
告訴預處理器不要丟棄注釋.配合`-E'選項使用. 
-P 
告訴預處理器不要產生`#line'命令.配合`-E'選項使用. 
-M  [ -MG ] 
告訴預處理器輸出一個適合make的規則,用於描述各目標文件的依賴關系.對於每個源文件,預處理
器輸出 一個make規則,該規則的目標項(target) 是源文件對應的目標文件名,依賴項
(dependency)是源文件中 `#include 引用的所有文件.生成的規則可以是單行,但如果太長,就用
`\'-換行符續成多行.規則 顯示在標准輸出,不產生預處理過的C程序. 
`-M'隱含了`-E'選項. 
`-MG '要求把缺失的頭文件按存在對待,並且假定他們和源程序文件在同一目錄下.必須和 `-M'選
項一起用. 
-MM  [ -MG ] 
和`-M'選項類似,但是輸出結果僅涉及用戶頭文件,象這樣`#include file"'. 忽略系統頭文件
如`#include <file>'.  
-MD  
和`-M'選項類似,但是把依賴信息輸出在文件中,文件名通過把輸出文件名末尾的`.o'替換為 `.
d'產生.同時繼續指定的編譯工作---`-MD '不象`-M'那樣阻止正常的編譯任務. 
Mach的實用工具`md'能夠合並`.d'文件,產生適用於`make'命令的單一的 依賴文件. 
-MMD 
和`-MD '選項類似,但是輸出結果僅涉及用戶頭文件,忽略系統頭文件. 
-H 
除了其他普通的操作, GCC顯示引用過的頭文件名. 
-Aquestion (answer) 
如果預處理器做條件測試,如`#if #question (answer)',該選項可以斷言(Assert) 
question 的答案是answer. -A- '關閉一般用於描述目標機的標准斷言. 
-Dmacro 
定義宏macro,宏的內容定義為字符串`1'. 
-Dmacro=defn 
定義宏macro的內容為defn.命令行上所有的`-D'選項在 `-U'選項之前處理. 
-Umacro 
取消宏macro. ` -U'選項在所有的`-D'選項之后處理,但是優先於任何 `-include '或`-imacros'選項. 
-dM  
告訴預處理器輸出有效的宏定義列表(預處理結束時仍然有效的宏定義).該選項需結合`-E'選項使
用. 
-dD  
告訴預處理器把所有的宏定義傳遞到輸出端,按照出現的順序顯示. 
-dN  
和`-dD '選項類似,但是忽略宏的參量或內容.只在輸出端顯示`#define  name.

匯編器選項(ASSEMBLER OPTION)
-Wa,option 
把選項option傳遞給匯編器.如果option含有逗號,就在逗號處分割成多個選項. 
  
連接器選項(LINKER OPTION)
下面的選項用於編譯器連接目標文件,輸出可執行文件的時候.如果編譯器不進行 連接,他們就毫無意義. 
object-file-name 
如果某些文件沒有特別明確的后綴a special recognized suffix, GCC就認為他們是目標文
件或庫文件. ( 根據文件內容,連接器能夠區分目標文件和庫文件).如果GCC 執行連接操作,這些目
標文件將成為連接器的輸入文件. 
-llibrary 
連接名為library的庫文件. 
連接器在標准搜索目錄中尋找這個庫文件,庫文件的真正名字是`lib library.a'.連接器會 當做
文件名得到准確說明一樣引用這個文件. 
搜索目錄除了一些系統標准目錄外,還包括用戶以`-L'選項指定的路徑. 
一般說來用這個方法找到的文件是庫文件--- 即由目標文件組成的歸檔文件(archive file).連
接器處理歸檔文件的 方法是:掃描歸檔文件,尋找某些成員,這些成員的符號目前已被引用,不過還沒
有被定義.但是,如果連接器找到普通的 目標文件,而不是庫文件,就把這個目標文件按平常方式連接
進來.指定`-l'選項和指定文件名的唯一區別是, ` -l選項用`lib '和`.a'把library包裹起來,
而且搜索一些目錄. 
-lobjc 
這個-l選項的特殊形式用於連接Objective C程序. 
-nostartfiles  
不連接系統標准啟動文件,而標准庫文件仍然正常使用. 
-nostdlib 
不連接系統標准啟動文件和標准庫文件.只把指定的文件傳遞給連接器. 
-static 
在支持動態連接(dynamic linking)的系統上,阻止連接共享庫.該選項在其他系統上無效. 
-shared 
生成一個共享目標文件,他可以和其他目標文件連接產生可執行文件.只有部分系統支持該選項. 
-symbolic 
建立共享目標文件的時候,把引用綁定到全局符號上.對所有無法解析的引用作出警告(除非用連接
編輯選項 `-Xlinker -z -Xlinker defs'取代).只有部分系統支持該選項. 
-Xlinker option 
把選項option傳遞給連接器.可以用他傳遞系統特定的連接選項, GNU CC 無法識別這些選項. 
如果需要傳遞攜帶參數的選項,你必須使用兩次`-Xlinker ',一次傳遞選項,另一次傳遞他的參
數. 例如,如果傳遞`-assert definitions',你必須寫成`-Xlinker -assert -Xlinker 
definitions',而不能寫成`-Xlinker "-assert definitions"',因為這樣會把整個 字符
串當做一個參數傳遞,顯然這不是連接器期待的. 
-Wl,option 
把選項option傳遞給連接器.如果option中含有逗號,就在逗號處分割成多個選項. 
-u  symbol 
使連接器認為取消了symbol的符號定義,從而連接庫模塊以取得定義.你可以使用多個 `-u'選項,
各自跟上不同的符號,使得連接器調入附加的庫模塊. 
  
目錄選項(DIRECTORY OPTION)
下列選項指定搜索路徑,用於查找頭文件,庫文件,或編譯器的某些成員: 
-Idir  
在頭文件的搜索路徑列表中添加dir 目錄. 
-I-  
任何在`-I- '前面用`-I'選項指定的搜索路徑只適用於`#include "file"'這種情況;他們不能
用來搜索`#include <file>'包含的頭文件. 
如果用`-I'選項指定的搜索路徑位於`-I- '選項后面,就可以在這些路徑中搜索所有的 
`#include '指令. ( 一般說來-I選項就是這么用的.) 
還有, ` -I- '選項能夠阻止當前目錄(存放當前輸入文件的地方)成為搜索`#include "file"'的
第一選擇.沒有辦法克服`-I- '選項的這個效應.你可以指定 `-I. '搜索那個目錄,它在調用編譯器
時是當前目錄.這和預處理器的默認行為不完全一樣,但是結果通常 令人滿意. 
`-I- '不影響使用系統標准目錄,因此, ` -I- '和`-nostdinc'是不同的選項. 
-Ldir  
在`-l'選項的搜索路徑列表中添加dir 目錄. 
-Bprefix 
這個選項指出在何處尋找可執行文件,庫文件,以及編譯器自己的數據文件. 
編譯器驅動程序需要執行某些下面的子程序: ` cpp ', `cc1 ' ( 或C++ 的 `cc1plus'), `as'和
`ld'.他把prefix當作欲執行的程序的 前綴,既可以包括也可以不包括`machine/version/'. 
對於要運行的子程序,編譯器驅動程序首先試着加上`-B'前綴(如果存在).如果沒有找到文件,或沒
有指定 `-B'選項,編譯器接着會試驗兩個標准前綴`/usr/lib/gcc/ '和 `/usr/local/lib/
gcc-lib/ '.如果仍然沒能夠找到所需文件,編譯器就在`PATH'環境變量 指定的路徑中尋找沒加任
何前綴的文件名. 
如果有需要,運行時(run-time)支持文件`libgcc.a '也在`-B'前綴的搜索范圍之內. 如果這里
沒有找到,就在上面提到的兩個標准前綴中尋找,僅此而已.如果上述方法沒有找到這個文件,就不連
接他了.多數 情況的多數機器上, ` libgcc.a '並非必不可少. 
你可以通過環境變量GCC_EXEC_PREFIX獲得近似的效果;如果定義了這個變量,其值就和上面說的 
一樣用做前綴.如果同時指定了`-B'選項和GCC_EXEC_PREFIX變量,編譯器首先使用 `-B'選項,
然后才嘗試環境變量值. 
  
警告選項(WARNING OPTION)
警告是針對程序結構的診斷信息,程序不一定有錯誤,而是存在風險,或者可能存在 錯誤. 
下列選項控制GNU CC產生的警告的數量和類型: 
-fsyntax-only  
檢查程序中的語法錯誤,但是不產生輸出信息. 
-w 
禁止所有警告信息. 
-Wno-import 
禁止所有關於#import的警告信息. 
-pedantic 
打開完全服從ANSI C標准所需的全部警告診斷;拒絕接受采用了被禁止的語法擴展的程序. 
無論有沒有這個選項,符合ANSI C標准的程序應該能夠被正確編譯(雖然極少數程序需要`-ansi' 
選項).然而,如果沒有這個選項,某些GNU 擴展和傳統C特性也得到支持.使用這個選項可以拒絕這些
程序.沒有理由 使用這個選項,他存在只是為了滿足一些書呆子(pedant). 
對於替選關鍵字(他們以`__'開始和結束) ` -pedantic'不會產生警告信息. Pedantic 也不警
告跟在__extension__ 后面的表達式.不過只應該在系統頭文件中使用這種轉義措施,應用程序最
好 避免. 
-pedantic-errors 
該選項和`-pedantic'類似,但是顯示錯誤而不是警告. 
-W 
對下列事件顯示額外的警告信息: 
   * 
非易變自動變量(nonvolatile automatic variable)可能在調用longjmp時發生改變. 這些
警告僅在優化編譯時發生. 
編譯器只知道對setjmp的調用,他不可能知道會在哪里調用longjmp,事實上一個 信號處理例程可
以在程序的任何地點調用他.其結果是,即使程序沒有問題,你也可能會得到警告,因為無法在可能出
現問題 的地方調用longjmp. 
   * 
既可以返回值,也可以不返回值的函數. ( 缺少結尾的函數體被看作不返回函數值)例如,下面的函數
將導致這種警告: 
foo (a)
{
  if (a > 0)
    return a;
}
 
由於GNU CC不知道某些函數永不返回(含有abort和longjmp),因此有可能出現 虛假警告. 
   * 
表達式語句或逗號表達式的左側沒有產生作用(side effect).如果要防止這種警告,應該把未使
用的表達式強制轉換 為void類型.例如,這樣的表達式`x[i,j]'會導致警告,而`x[(void)i,
j]'就不會. 
   * 
無符號數用`>'或`<='和零做比較. 
-Wimplicit-int 
警告沒有指定類型的聲明. 
-Wimplicit-function-declaration 
警告在聲明之前就使用的函數. 
-Wimplicit 
同-Wimplicit-int和-Wimplicit-function-declaration. 
-Wmain 
如果把main函數聲明或定義成奇怪的類型,編譯器就發出警告.典型情況下,這個函數用於外部連
接, 返回int 數值,不需要參數,或指定兩個參數. 
-Wreturn-type  
如果函數定義了返回類型,而默認類型是int 型,編譯器就發出警告.同時警告那些不帶返回值的 
return語句,如果他們所屬的函數並非void類型. 
-Wunused  
如果某個局部變量除了聲明就沒再使用,或者聲明了靜態函數但是沒有定義,或者某條語句的運算結
果顯然沒有使用, 編譯器就發出警告. 
-Wswitch  
如果某條switch語句的參數屬於枚舉類型,但是沒有對應的case語句使用枚舉元素,編譯器 就發出
警告. ( default語句的出現能夠防止這個警告.)超出枚舉范圍的case語句同樣會 導致這個警
告. 
-Wcomment 
如果注釋起始序列`/*'出現在注釋中,編譯器就發出警告. 
-Wtrigraphs 
警告任何出現的trigraph (假設允許使用他們). 
-Wformat  
檢查對printf和scanf等函數的調用,確認各個參數類型和格式串中的一致. 
-Wchar-subscripts 
警告類型是char的數組下標.這是常見錯誤,程序員經常忘記在某些機器上char有符號. 
-Wuninitialized 
在初始化之前就使用自動變量. 
這些警告只可能做優化編譯時出現,因為他們需要數據流信息,只有做優化的時候才估算數據流信
息.如果不指定 `-O'選項,就不會出現這些警告. 
這些警告僅針對等候分配寄存器的變量.因此不會發生在聲明為volatile 的變量上面,不會發生在
已經 取得地址的變量,或長度不等於1, 2, 4, 8字節的變量.同樣也不會發生在結構,聯合或數組
上面,即使他們在 寄存器中. 
注意,如果某個變量只計算了一個從未使用過的值,這里可能不會警告.因為在顯示警告之前,這樣的
計算已經被 數據流分析刪除了. 
這些警告作為可選項是因為GNU CC還沒有智能到判別所有的情況,知道有些看上去錯誤的代碼其實
是正確的.下面是 一個這樣的例子: 
{
  int x;
  switch (y)
    {
    case 1: x = 1;
      break;
    case 2: x = 4;
      break;
    case 3: x = 5;
    }
  foo (x);
}
 
如果y始終是1, 2或3,那么x總會被初始化,但是GNU CC不知道這一點.下面是 另一個普遍案例: 
{
  int save_y;
  if (change_y) save_y = y, y = new_y;
  ...
  if (change_y) y = save_y;
}
 
這里沒有錯誤,因為只有設置了save_y才使用他. 
把所有不返回的函數定義為volatile 可以避免某些似是而非的警告. 
-Wparentheses  
在某些情況下如果忽略了括號,編譯器就發出警告. 
-Wtemplate-debugging 
當在C++ 程序中使用template 的時候,如果調試(debugging)沒有完全生效,編譯器就發出警告. 
(僅用於C++). 
-Wall 
結合所有上述的`-W'選項.通常我們建議避免這些被警告的用法,我們相信,恰當結合宏的使用能
夠 輕易避免這些用法。 
剩下的`-W...'選項不包括在`-Wall'中,因為我們認為在必要情況下,這些被編譯器警告 的程序結構,可
以合理的用在"干凈的"程序中. 
-Wtraditional  
如果某些程序結構在傳統C中的表現和ANSI C不同,編譯器就發出警告. 
   * 
宏參出現在宏體的字符串常量內部.傳統C會替換宏參,而ANSI C則視其為常量的一部分. 
   * 
某個函數在塊(block)中聲明為外部,但在塊結束后才調用. 
 
switch語句的操作數類型是long. 
-Wshadow  
一旦某個局部變量屏蔽了另一個局部變量,編譯器就發出警告. 
-Wid-clash-len  
一旦兩個確定的標識符具有相同的前len 個字符,編譯器就發出警告.他可以協助你開發一些將要在
某些 過時的,危害大腦的編譯器上編譯的程序. 
-Wpointer-arith 
任何語句如果依賴於函數類型的大小(size)或者void類型的大小,編譯器就發出警告. GNU C為
了 便於計算void *指針和函數指針,就把這些類型的大小定義為1. 
-Wcast-qual 
一旦某個指針強制類型轉換以便移除類型修飾符時,編譯器就發出警告.例如,如果把const char 
* 強制轉換為普通的char *時,警告就會出現. 
-Wcast-align 
一旦某個指針類型強制轉換時,導致目標所需的地址對齊(alignment)增加,編譯器就發出警告.例
如,某些機器上 只能在2或4字節邊界上訪問整數,如果在這種機型上把char *強制轉換成int *類
型, 編譯器就發出警告. 
-Wwrite-strings 
規定字符串常量的類型是const char[length],因此,把這樣的地址復制給 non-const char 
*指針將產生警告.這些警告能夠幫助你在編譯期間發現企圖寫入字符串常量 的代碼,但是你必須非
常仔細的在聲明和原形中使用const,否則他們只能帶來麻煩;所以我們沒有讓 `-Wall'提供這些警
告. 
-Wconversion 
如果某函數原形導致的類型轉換和無函數原形時的類型轉換不同,編譯器就發出警告.這里包括定點
數和浮點數的 互相轉換,改變定點數的寬度或符號,除非他們和缺省聲明(default promotion)
相同. 
-Waggregate-return  
如果定義或調用了返回結構或聯合的函數,編譯器就發出警告. ( 從語言角度你可以返回一個數組,
然而同樣會 導致警告.) 
-Wstrict-prototypes 
如果函數的聲明或定義沒有指出參數類型,編譯器就發出警告. ( 如果函數的前向引用說明指出了參
數類型,則允許后面 使用舊式風格的函數定義,而不會產生警告.) 
-Wmissing-prototypes 
如果沒有預先聲明函數原形就定義了全局函數,編譯器就發出警告.即使函數定義自身提供了函數原
形也會產生這個警告. 他的目的是檢查沒有在頭文件中聲明的全局函數. 
-Wmissing-declarations 
如果沒有預先聲明就定義了全局函數,編譯器就發出警告.即使函數定義自身提供了函數原形也會產
生這個警告.這個選項 的目的是檢查沒有在頭文件中聲明的全局函數. 
-Wredundant-decls 
如果在同一個可見域某定義多次聲明,編譯器就發出警告,即使這些重復聲明有效並且毫無差別. 
-Wnested-externs 
如果某extern聲明出現在函數內部,編譯器就發出警告. 
-Wenum-clash 
對於不同枚舉類型之間的轉換發出警告(僅適用於C++). 
-Wlong-long 
如果使用了long long 類型就發出警告.該警告是缺省項.使用`-Wno-long-long' 選項能夠防
止這個警告. ` -Wlong-long'和`-Wno-long-long'僅在 `-pedantic'之下才起作用. 
-Woverloaded-virtual 
(僅適用於C++.)在繼承類中,虛函數的定義必須匹配虛函數在基類中聲明的類型特征(type 
signature).當 繼承類聲明了某個函數,它可能是個錯誤的嘗試企圖定義一個虛函數,使用這個選
項能夠產生警告:就是說,當某個函數和基類 中的虛函數同名,但是類型特征不符合基類的任何虛函
數,編譯器將發出警告. 
-Winline  
如果某函數不能內嵌(inline),無論是聲明為inline或者是指定了-finline-functions  選
項,編譯器都將發出警告. 
-Werror 
視警告為錯誤;出現任何警告即放棄編譯. 
  
調試選項(DEBUGGING OPTION)
GNU CC擁有許多特別選項,既可以調試用戶的程序,也可以對GCC 排錯: 
-g 
以操作系統的本地格式(stabs, COFF, XCOFF,或DWARF).產生調試信息. GDB能夠使用這些調
試信息. 
在大多數使用stabs格式的系統上, ` -g'選項啟動只有GDB 才使用的額外調試信息;這些信息使
GDB 調試效果更好,但是有可能導致其他調試器崩潰,或拒絕讀入程序.如果你確定要控制是否生成
額外的信息, 使用`-gstabs+ ', `-gstabs', `-gxcoff+ ', `-gxcoff', `-gdwarf+ ',或
`-gdwarf' ( 見下文). 
和大多數C編譯器不同, GNU CC 允許結合使用`-g'和`-O'選項.優化的代碼偶爾制造 一些驚異的
結果:某些聲明過的變量根本不存在;控制流程直接跑到沒有預料到的地方;某些語句因為計算結果
是常量或已經確定而 沒有執行;某些語句在其他地方執行,因為他們被移到循環外面了. 
然而它證明了調試優化的輸出是可能的.對可能含有錯誤的程序使用優化器是合理的. 
如果GNU CC支持輸出多種調試信息,下面的選項則非常有用. 
-ggdb 
以本地格式(如果支持)輸出調試信息,盡可能包括GDB 擴展. 
-gstabs 
以stabs格式(如果支持)輸出調試信息,不包括GDB 擴展.這是大多數BSD 系統上DBX 使用的格式. 
-gstabs+  
以stabs格式(如果支持)輸出調試信息,使用只有GNU 調試器(GDB)理解的GNU 擴展.使用這些擴展
有可能導致 其他調試器崩潰或拒絕讀入程序. 
-gcoff 
以COFF格式(如果支持)輸出調試信息.這是在System V 第四版以前的大多數System V 系統上SDB
使用的 格式. 
-gxcoff 
以XCOFF格式(如果支持)輸出調試信息.這是IBM RS/6000系統上DBX 調試器使用的格式. 
-gxcoff+  
以XCOFF格式(如果支持)輸出調試信息,使用只有GNU 調試器(GDB)理解的GNU 擴展.使用這些擴展
有可能導致 其他調試器崩潰或拒絕讀入程序. 
-gdwarf 
以DWARF格式(如果支持)輸出調試信息.這是大多數System V 第四版系統上SDB 使用的格式. 
-gdwarf+  
以DWARF格式(如果支持)輸出調試信息,使用只有GNU 調試器(GDB)理解的GNU 擴展.使用這些擴展
有可能導致 其他調試器崩潰或拒絕讀入程序. 
-glevel  
-ggdblevel  
-gstabslevel  
-gcofflevel -gxcofflevel 
-gdwarflevel 
請求生成調試信息,同時用level指出需要多少信息.默認的level值是2. 
Level 1輸出最少量的信息,僅夠在不打算調試的程序段內backtrace.包括函數和外部變量的描
述,但是 沒有局部變量和行號信息. 
Level 3包含更多的信息,如程序中出現的所有宏定義.當使用`-g3 '選項的時候,某些調試器支持 
宏擴展. 
-p 
產生額外代碼,用於輸出profile信息,供分析程序prof使用. 
-pg  
產生額外代碼,用於輸出profile信息,供分析程序gprof使用. 
-a 
產生額外代碼,用於輸出基本塊(basic block) 的profile信息,它記錄各個基本塊的執行次數,
供諸如 tcov此類的程序分析.但是注意,這個數據格式並非tcov期待的.最終GNU gprof 將處理
這些數據. 
-ax  
產生額外代碼,用於從'bb.in'文件讀取基本塊的profile參數,把profile的結果寫到'bb.
out' 文件. `bb.in'包含一張函數列表.一旦進入列表中的某個函數, profile操作就開始,離
開最外層的函數后, profile操作就結束.以`-' 為前綴名的函數排除在profile操作之外.如果函
數名不是唯一的,它可以寫成 `/path/filename.d:functionname'來澄清. `bb.out'將列出
一些有效的文件名.這四個函數名具有 特殊含義: `__bb_jumps__'導致跳轉(jump)頻率寫進
`bb.out'. `__bb_trace__'導致基本塊序列通過 管道傳到`gzip',輸出`bbtrace.gz'文
件. `__bb_hidecall__'導致從跟蹤(trace)中排除call 指令. `__bb_showret__' 導致在
跟蹤中包括返回指令. 
-dletters 
編譯的時候,在letters指定的時刻做調試轉儲(dump).用於調試編譯器.大多數轉儲的文件名 通
過源文件名添加字詞獲得(例如`foo.c.rtl'或`foo.c.jump').  
-dM  
預處理結束的時候轉儲所有的宏定義,不輸出到文件. 
-dN  
預處理結束的時候轉儲所有的宏名. 
-dD  
預處理結束的時候轉儲所有的宏定義,同時進行正常輸出. 
-dy  
語法分析(parse)的時候在標准錯誤轉儲調試信息. 
-dr  
RTL 階段后轉儲到`file.rtl'. 
-dx  
僅對函數生成RTL,而不是編譯.通常和`r'聯用. 
-dj  
第一次跳轉優化后轉儲到`file.jump'. 
-ds  
CSE (包括有時候跟在CSE 后面的跳轉優化)后轉儲到`file.cse'. 
-dL  
循環優化后轉儲到`file.loop'. 
-dt  
第二次CSE 處理(包括有時候跟在CSE 后面的跳轉優化)后轉儲到`file.cse2'. 
-df  
流程分析(flow analysis)后轉儲到`file.flow'. 
-dc  
指令組合(instruction combination)后轉儲到`file.combine '. 
-dS  
第一次指令安排(instruction schedule)后轉儲到`file.sched'. 
-dl  
局部寄存器分配后轉儲到`file.lreg'. 
-dg  
全局寄存器分配后轉儲到`file.greg'. 
-dR  
第二次指令安排(instruction schedule)后轉儲到`file.sched2'. 
-dJ  
最后一次跳轉優化后轉儲到`file.jump2'. 
-dd  
推遲分支調度(delayed branch scheduling)后轉儲到`file.dbr'. 
-dk  
寄存器-堆棧轉換后轉儲到`file.stack'. 
-da  
產生以上所有的轉儲. 
-dm  
運行結束后,在標准錯誤顯示內存使用統計. 
-dp  
在匯編輸出加注指明使用了哪些模式(pattern)及其替代模式. 
-fpretend-float 
交叉編譯的時候,假定目標機和宿主機使用同樣的浮點格式.它導致輸出錯誤的浮點常數,但是在目
標機上運行的時候, 真實的指令序列有可能和GNU CC希望的一樣. 
-save-temps 
保存那些通常是``臨時''的中間文件;置於當前目錄下,並且根據源文件命名.因此,用`-c -save-temps'選項編譯`foo.c '會生成` foo.cpp'和`foo.s' 以及`foo.o'文件. 
-print-file-name=library 
顯示庫文件library的全路徑名,連接時會使用這個庫--- 其他什么事情都不作.根據這個選項, 
GNU CC既不編譯,也不連接,僅僅顯示文件名. 
-print-libgcc-file-name  
和`-print-file-name=libgcc.a'一樣. 
-print-prog-name=program 
類似於`-print-file-name',但是查找程序program如`cpp '. 
  
優化選項(OPTIMIZATION OPTION)
這些選項控制多種優化措施: 
-O 
-O1  
優化.對於大函數,優化編譯占用稍微多的時間和相當大的內存. 
不使用`-O'選項時,編譯器的目標是減少編譯的開銷,使編譯結果能夠調試.語句是獨立的:如果在 
兩條語句之間用斷點中止程序,你可以對任何變量重新賦值,或者在函數體內把程序計數器指到其他
語句,以及從源程序中 精確地獲取你期待的結果. 
不使用`-O'選項時,只有聲明了register 的變量才分配使用寄存器.編譯結果比不用 `-O'選項的
PCC 要略遜一籌. 
使用了`-O'選項,編譯器會試圖減少目標碼的大小和執行時間. 
如果指定了`-O'選項, ` -fthread-jumps'和`-fdefer-pop'選項將被 打開.在有delay 
slot的機器上, ` -fdelayed-branch'選項將被打開.在即使沒有幀指針 (frame pointer)也
支持調試的機器上, ` -fomit-frame-pointer'選項將被打開.某些機器上 還可能會打開其他選
項. 
-O2  
多優化一些.除了涉及空間和速度交換的優化選項,執行幾乎所有的優化工作.例如不進行循環展開
(loop unrolling)和函數內嵌(inlining).和-O選項比較,這個選項既增加了編譯時間,也提高
了生成代碼的 運行效果. 
-O3  
優化的更多.除了打開-O2 所做的一切,它還打開了-finline-functions 選項. 
-O0  
不優化. 
如果指定了多個-O選項,不管帶不帶數字,最后一個選項才是生效的選項. 
諸如`-fflag'此類的選項描述一些機器無關的開關.大多數開關具有肯定和否定兩種格式; ` -ffoo'開關
選項的否定格式應該是`-fno-foo '.下面的列表只展示了一種格式--- 那個不是 默認選項的格式.你可以通
過去掉或添加`no- '構造出另一種格式. 
-ffloat-store  
不要在寄存器中存放浮點變量.這樣可以防止某些機器上不希望的過高精度,如68000的浮點寄存器
(來自 68881)保存的精度超過了double應該具有的精度. 
對於大多數程序,過高精度只有好處.但是有些程序嚴格依賴於IEEE浮點數的定義.對這樣的程序可
以使用 `-ffloat-store '選項. 
-fmemoize-lookups 
-fsave-memoized 
使用探索法(heuristic)進行更快的編譯(僅對C++).默認情況下不使用探索法.由於探索法只對
某些輸入文件 有效,其他程序的編譯速度會變得更慢. 
第一次編譯器必須對成員函數(或對成員數據的引用)建立一個調用.它必須(1) 判斷出這個類是否實
現了那個名字的 成員函數; (2)決定調用哪個成員函數(涉及到推測需要做哪種類型轉換); (3)檢
查成員函數對調用者是否可見.所有這些構成 更慢的編譯.一般情形,第二次對成員函數(或對成員數
據的引用)建立的調用,必須再次經過相同長度的處理.這意味着象 這樣的代碼 
cout << "This " << p << " has " << n << " legs.\n"; 
對整個三步驟要做六次遍歷.通過使用軟件緩存, ``命中''能夠顯著地減少這種代價.然而不幸的
是,使用這種緩存 必須實現其他機制,帶來了它自己的開銷. ` -fmemoize-lookups'選項打開軟
件緩存. 
因為函數的正文環境不同,函數對成員和成員函數的訪問權(可見性)也可能不同, g++ 可能需要刷
新緩存. 使用`-fmemoize-lookups'選項,每編譯完一個函數就刷新緩存.而`-fsave-memoized'選項 也啟用同樣的緩存,但是當編譯器發覺最后編譯的函數的正文環境產生的訪問權和
下一個待編譯的函數相同,編譯器就 保留緩存內容.這對某個類定義許多成員函數時非常有用:除了
某些其他類的友函數,每個成員函數擁有和其他成員函數完全一樣 的訪問權,因而無需刷新緩存. 
-fno-default-inline 
默認為不要把成員函數內嵌,因為它們定義在類的作用域內(僅C++). 
-fno-defer-pop 
一旦函數返回,參數就立即彈出.對於那些調用函數后必須彈出參數的機器,編譯器一般情況下讓幾
次函數調用的參數 堆積在棧上,然后一次全部彈出. 
-fforce-mem 
做數學運算前把將要使用的內存操作數送入寄存器.通過把內存訪問轉換成潛在的公共子表達式,它
可能產生較好的目標碼. 如果它們不是公共子表達式,指令組合應該消除各自的寄存器載荷.我樂意
傾聽不同意見. 
-fforce-addr 
做數學運算前把將要使用的內存地址常數送入寄存器.它可能和`-fforce-mem'一樣產生較好的 目
標碼.我樂意傾聽不同意見. 
-fomit-frame-pointer 
對於不需要幀指針(frame pointer)的函數,不要在寄存器中保存幀指針.這樣能夠避免保存,設
置和恢復 幀指針的指令;同時對許多函數提供一個額外的寄存器. 但是在大多數機器上將無法調
試. 
某些機器上,如Vax,這個選項無效,因為標准調用序列自動處理幀指針,通過假裝不存在而不保存任
何東西.機器描述宏 FRAME_POINTER_REQUIRED控制目標機是否支持這個選項. 
-finline-functions  
把所有簡單的函數集成進調用者.編譯器探索式地決定哪些函數足夠簡單,值得這種集成. 
如果集成了所有給定函數的調用,而且函數聲明為static,那么一般說來GCC 有權不按匯編代碼輸出
函數. 
-fcaller-saves 
允許在寄存器里分配數值,但是這個方案通常受到各個函數調用的沖擊,因此GCC 生成額外的代碼,在
函數調用的 前后保存和復原寄存器內容.僅當生成代碼看上去優於反之結果時才實現這樣的分配. 
某些機器上該選項默認為允許,通常這些機器沒有調用保護寄存器代替使用. 
-fkeep-inline-functions  
即使集成了某個函數的所有調用,而且該函數聲明為static,仍然輸出這個函數一個獨立的,運行時
可調用 的版本. 
-fno-function-cse 
不要把函數地址存入寄存器;讓調用固定函數的指令顯式給出函數地址. 
這個選項產生效率較低的目標碼,但是如果不用這個選項,某些不尋常的hack,改變匯編器的輸出,
可能因優化而帶來 困惑. 
-fno-peephole  
禁止任何機器相關的peephole 優化. 
-ffast-math 
這個選項出於速度優化,允許GCC 違反某些ANSI或IEEE規則/規格.例如,它允許編譯器假設sqrt 
函數的參數是非負數. 
這個選項不被任何`-O'選項打開,因為對於嚴格依靠IEEE或ANSI規則/規格實現的數學函數,程序
可能 會產生錯誤的結果. 
下列選項控制特定的優化. ` -O2 '選項打開下面的大多數優化項,除了`-funroll-loops'和 `-funroll-all-loops'項. 
而`-O'選項通常打開`-fthread-jumps'和`-fdelayed-branch' 優化項,但是特定的機器上的默認優
化項有可能改變. 
如果特別情況下非常需要``微調''優化,你可以使用下面的選項. 
-fstrength-reduce 
執行循環強度縮小(loop strength reduction)優化,並且消除重復變量. 
-fthread-jumps 
執行優化的地點是,如果某個跳轉分支的目的地存在另一個條件比較,而且該條件比較包含在前一個
比較語句之內,那么 執行優化.根據條件是true或者false,前面那條分支重定向到第二條分支的目
的地或者緊跟在第二條分支后面. 
-funroll-loops 
執行循環展開(loop unrolling)優化.僅對循環次數能夠在編譯時或運行時確定的循環實行. 
-funroll-all-loops  
執行循環展開(loop unrolling)優化.對所有循環實行.通常使程序運行的更慢. 
-fcse-follow-jumps  
在公共子表達式消元(common subexpression elimination)的時候,如果沒有其他路徑到達
某個跳轉的 目的地,就掃過這條jump指令.例如,如果CSE 遇到帶有else從句的if語句,當條件測試
為 false時, CSE就跟在jump后面. 
-fcse-skip-blocks 
它類似於`-fcse-follow-jumps '選項,但是CSE 跟在條件跳轉后面,條件跳轉跳過了 語句塊
(block). 如果CSE 遇到一條簡單的if語句,不帶else從句, ` -fcse-skip-blocks'選項將導致
CSE 跟在if產生的跳轉后面. 
-frerun-cse-after-loop 
執行循環優化后,重新進行公共子表達式消元. 
-felide-constructors 
如果看上去合理就省略構造子(僅C++).根據這個選項,對於下面的代碼, GNU C++直接從調用
foo  初始化y,而無需通過臨時變量: 
A foo (); A y = foo ();  
如果沒有這個選項, GNU C++首先通過調用類型A 合適的構造子初始化y;然后把 foo 的結果賦給
臨時變量;最后,用臨時變量替換`y'的初始值. 
ANSI C++ 標准草案規定了默認行為(`-fno-elide-constructors '). 如果程序的構造子存在 
副效應, ` -felide-constructors'選項能夠使程序有不同的表現,因為可能忽略一些構造子的
調用. 
-fexpensive-optimizations 
執行一些相對開銷較大的次要優化. 
-fdelayed-branch 
如果對目標機支持這個功能,它試圖重新排列指令,以便利用延遲分支(delayed branch)指令后
面的指令空隙. 
-fschedule-insns 
如果對目標機支持這個功能,它試圖重新排列指令,以便消除因數據未緒造成的執行停頓.這可以幫
助浮點運算或內存訪問 較慢的機器調取指令,允許其他指令先執行,直到調取指令或浮點運算完成. 
-fschedule-insns2 
類似於`-fschedule-insns'選項,但是在寄存器分配完成后,需要一個額外的指令調度過程.對
於 寄存器數目相對較少,而且取內存指令大於一個周期的機器,這個選項特別有用. 
  
目標機選項(TARGET OPTION)
缺省情況下, GNU CC 編譯出本機類型的目標碼.然而也可以把他安裝成交叉編譯器, 為其他機型編譯程序.
事實上,針對不同的目標機,可以同時安裝GNU CC相應的配置.然后用`-b'選項指定 目標機種. 
順便提一下,新版本和舊版本的GNU CC可以共存.其中一個版本(可能是最新的那個)為缺省版本,但是有時
候你希望使用 其他版本. 
-b  machine 
參數machine指出編譯的目標機種.這個選項用於安裝為交叉編譯器的GNU CC. 
參數machine的值和配置GNU CC交叉編譯器時設置的機器類型一樣.例如,如果交叉編譯器配置有 
file:///E|/BOOK/教程資料/Linux/Linhan 搜集整理  QQ-3335231    E-mail  -   ningyuanbin@163.com.htm (32 of 54)2005-7-9 9:41:49
GCC中文手冊
`configure i386v', 意思是編譯80386上的System V 目標碼,那么你可以通過`-b i386v '運
行交叉編譯器. 
如果沒有指定`-b'選項,通常指編譯本機目標碼. 
-V  version 
參數version指出運行哪個版本的GNU CC.這個選項用於安裝了多個版本的GCC.例如,如果 
version是`2.0 ',意味着運行GNU CC 2.0版. 
如果沒有指定`-V'選項,缺省版本取決於GNU CC的安裝方式,一般說來推薦使用通用版本. 
  
機器相關選項(MACHINE DEPENDENT OPTION)
每一種目標機型都有自己的特別選項,這些選項用`-m  '開關引導,選擇不同的硬件型號或配置--- 例如, 
68010還是68020,有沒有浮點協處理器.通過指定選項,安裝 編譯器的一個版本能夠為所有的型號或配置進
行編譯. 
此外,編譯器的某些配置支持附加的特殊選項,通常是為了在命令行上兼容這個平台的其他編譯器. 
下面是針對68000系列定義的`-m'選項: 
-m68000 
-mc68000  
輸出68000的目標碼.如果編譯器按基於68000的系統配置,這個選項就是缺省選項. 
-m68020 
-mc68020  
輸出68020的目標碼(而不是68000).如果編譯器按基於68020的系統配置,這個選項就是缺省選
項. 
-m68881 
輸出包含68881浮點指令的目標碼.對於大多數基於68020的系統這是缺省選項,除非設置編譯器時
指定了 -nfp . 
-m68030 
輸出68030的目標碼.如果編譯器按基於68030的系統配置,這個選項就是缺省選項. 
-m68040 
輸出68040的目標碼.如果編譯器按基於68040的系統配置,這個選項就是缺省選項. 
-m68020-40 
輸出68040的目標碼,但是不使用新指令.生成的代碼可以在68020/68881上,也可以在68030或 
68040上較有效地運行. 
-mfpa 
輸出包含SUN FPA浮點指令的目標碼. 
-msoft-float 
輸出包含浮點庫調用的目標碼. 警告:所需的庫不是GNU CC的組成部分.一般說來GCC 使用該機型
本地C 編譯器的相應部件,但是作交叉編譯時卻不能直接使用.你必須自己管理提供合適的函數庫用
於交叉編譯. 
-mshort 
認為int 類型是16位寬,相當於short int. 
-mnobitfield 
不使用位域(bit-field)指令. ` -m68000'隱含指定了`-mnobitfield'. 
-mbitfield 
使用位域指令. ` -m68020'隱含指定了`-mbitfield'.如果你使用未改裝的gcc,這就是 默認選
項. 
-mrtd 
采用另一種函數調用約定,函數接受固定數目的參數,用rtd 指令返回,該指令返回時彈出棧內的參
數.這個 方法能夠使調用者節省一條指令,因為他這里不需要彈出參數. 
這種調用約定不兼容UNIX的正常調用.因此如果你需要調用UNIX編譯器編譯的庫函數,你就不能使
用這個選項. 
此外,所有參數數量可變地函數必須提供函數原型(包括printf);否則編譯器會生成錯誤的調用代
碼. 
file:///E|/BOOK/教程資料/Linux/Linhan 搜集整理  QQ-3335231    E-mail  -   ningyuanbin@163.com.htm (34 of 54)2005-7-9 9:41:49
GCC中文手冊
另外,如果調用函數時攜帶了過多的參數,編譯器將生成嚴重錯誤的代碼. ( 正常情況下,多余的參數
被安全無害的忽略.) 
68010和68020處理器支持rtd 指令,但是68000不支持. 
下面是針對VAX 定義的`-m'選項: 
-munix 
禁止輸出某些跳轉指令(aobleq等等), VAX的UNIX匯編器無法跨越長范圍(long ranges) 進行
處理. 
-mgnu 
如果使用GNU 匯編器,則輸出那些跳轉指令, 
-mg  
輸出g-format 浮點數,取代d-format. 
下面是SPARC支持的`-m'選項開關: 
-mfpu 
-mhard-float 
輸出包含浮點指令的目標碼.這是缺省選項. 
-mno-fpu  
-msoft-float 
輸出包含浮點庫調用的目標碼. 警告:沒有為SPARC提供GNU 浮點庫.一般說來使用該機型本地C編
譯器 的相應部件,但是不能直接用於交叉編譯.你必須自己安排,提供用於交叉編譯的庫函數. 
-msoft-float改變了輸出文件中的調用約定;因此只有用這個選項編譯整個程序才有意義. 
-mno-epilogue  
-mepilogue 
使用-mepilogue (缺省)選項時,編譯器總是把函數的退出代碼放在函數的尾部.任何在函數中間 
的退出語句(例如C中的return語句)將產生出跳轉指令指向函數尾部. 
使用-mno-epilogue 選項時,編譯器盡量在每個函數退出點嵌入退出代碼. 
-mno-v8 
-mv8 
-msparclite 
這三個選項選擇不同種類的SPARC系統. 
默認情況下(除非特別為Fujitsu SPARClite配置), GCC生成SPARC v7 目標碼. 
-mv8生成SPARC v8 目標碼.他和v7目標碼唯一的區別是,編譯器生成整數乘法和整數除法指令, 
SPARC v8 支持該指令,而v7體系不支持. 
-msparclite生成SPARClite目標碼.增加了SPARClite支持的整數乘法,整數除法單步掃描 
(integer divide step and scan (ffs))指令. v7體系不支持這些指令. 
-mcypress 
-msupersparc 
這兩個選項選擇處理器型號,針對處理器進行代碼優化. 
-mcypress選項(默認項)使編譯器對Cypress CY7C602芯片優化代碼, SparcStation/
SparcServer 3xx系列使用這種芯片.該選項也適用於老式的SparcStation 1, 2, IPX  等機
型.. 
-msupersparc選項使編譯器對SuperSparc處理器優化代碼, SparcStation 10, 1000 和
2000系列使用這種芯片.同時該選項啟用完整的SPARC v8 指令集. 
下面是針對Convex定義的`-m'選項: 
-mc1 
輸出C1的目標碼.當編譯器對C1配置時,這是默認選項. 
-mc2 
輸出C2的目標碼.當編譯器對C2配置時,這是默認選項. 
-margcount 
在每個參數列表的前面放置一個參數計數字(argument count word).某些不可移植的Convex
和Vax 程序需要這個參數計數字. ( 調試器不需要他,除非函數帶有變長參數列表;這個信息存放在
符號表中.) 
-mnoargcount 
忽略參數計數字.如果你使用未改裝的gcc,這是默認選項. 
下面是針對AMD Am29000定義的`-m'選項: 
-mdw 
生成的目標碼認為DW置位,就是說,字節和半字操作由硬件直接支持.該選項是默認選項. 
-mnodw 
生成的目標碼認為DW沒有置位. 
-mbw 
生成的目標碼認為系統支持字節和半字寫操作.該選項是默認選項. 
-mnbw 
生成的目標碼認為系統不支持字節和半字寫操作.該選項隱含開啟了`-mnodw'選項. 
-msmall 
使用小內存模式,小內存模式假設所有函數的地址位於某個256 KB段內,或者所有函數的絕對地址
小於256K.這樣 就可以用call指令代替const, consth, calli指令序列. 
-mlarge 
假設不能使用call指令;這是默認選項. 
-m29050 
輸出Am29050的目標碼. 
-m29000 
輸出Am29000的目標碼.這是默認選項. 
-mkernel-registers  
生成的目標碼引用gr64-gr95寄存器而不是gr96-gr127寄存器.該選項可以用於編譯 內核代碼,
內核需要一組全局寄存器,這些全局寄存器和用戶模式使用的寄存器完全無關. 
注意,使用這個選項時, ` -f'選項中的寄存器名字必須是normal, user-mode, names. 
-muser-registers 
使用普通全局寄存器集gr96-gr127.這是默認選項. 
-mstack-check  
在每次堆棧調整后插入一條__msp_check調用.這個選項常用於內核代碼. 
下面是針對Motorola 88K體系定義的`-m'選項: 
-m88000 
生成的目標碼可以在m88100和m88110上正常工作. 
-m88100 
生成的目標碼在m88100上工作的最好,但也可以在m88110上運行. 
-m88110 
生成的目標碼在m88110上工作的最好,可能不能在m88100上運行. 
-midentify-revision 
在匯編器的輸出端包含一條ident指令,記錄源文件名,編譯器名字和版本,時標,以及使用的編譯選
項, 
-mno-underscores 
在匯編器的輸出端,符號名字前面不添加下划線.默認情況是在每個名字前面增加下划線前綴. 
-mno-check-zero-division 
-mcheck-zero-division 
早期型號的88K 系統在除零操作上存在問題,特定情況下許多機器無法自陷.使用這些選項可以避免
包含(或可以 顯明包含)附加的代碼,這些代碼能夠檢查除零錯,發送例外信號. GCC所有88K 的配置
默認使用 `-mcheck-zero-division'選項. 
-mocs-debug-info 
-mno-ocs-debug-info 
包含(或忽略)附加的調試信息(關於每個棧架結構中寄存器的使用), 88Open Object 
Compatibility Standard, ``OCS'',對此信息做了說明. GDB不需要這些額外信息. DG/
UX, SVr4,和Delta 88 SVr3.2的默認配置是包含調試信息,其他88k 機型的默認配置是忽略這
個信息. 
-mocs-frame-position 
-mno-ocs-frame-position  
強制(或不要求)把寄存器值存儲到棧架結構中的指定位置(按OCS 的說明). DG/UX, Delta88 
SVr3.2和 BCS 的默認配置使用`-mocs-frame-position'選項;其他88k 機型的默認配置是 `-mno-ocs-frame-position'. 
-moptimize-arg-area 
-mno-optimize-arg-area 
控制如何在堆棧結構中存儲函數參數. ` -moptimize-arg-area'節省空間,但是有可能宕掉某些 
調試器(不是GDB). `-mno-optimize-arg-area'證實比標准選項好.默認情況下GCC 不優化參
數域. 
-mshort-data-  
num 通過和r0關聯,產生較小的數據引用(data reference),這樣就可以用單指令調入 一個數值
(而不是平常的雙指令).用戶通過選項中的num 控制改變哪種數據引用.例如,如果你指定了 `-mshort-data-512',那么受影響的數據引用是小於512 字節的數據移動. -mshort-data- num
選項對大於64K 的num 無效. 
-mserialize-volatile 
-mno-serialize-volatile  
產生,或不產生代碼來保證對易變內存訪問的結果一致. 
對於常用的處理器子型號, GNU CC 始終默認保證這種一致性.如何實現結果一致取決於處理器子型
號. 
m88100處理器不對內存引用重新安排,因此訪問結果始終一致.如果使用了`-m88100'選項, 
GNU CC 不產生任何針對結果一致的特別指令. 
m88110處理器的內存引用順序並不始終符合指令請求的引用順序.特別是某條讀取指令可能在先前
的存儲指令之前執行. 多處理器環境下,亂序訪問擾亂了易變內存訪問的結果一致.因此當使用`-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 風
格.其他配置均忽略該選項. 
file:///E|/BOOK/教程資料/Linux/Linhan 搜集整理  QQ-3335231    E-mail  -   ningyuanbin@163.com.htm (40 of 54)2005-7-9 9:41:49
GCC中文手冊
-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 是 default, GCC
將選取任何機型上都是最長周期時間的指令,這樣才能使代碼在所有的MIPS處理器上以合理 的速度
運行. cpu-type 的其他選擇是r2000, r3000, r4000,和 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 
file:///E|/BOOK/教程資料/Linux/Linhan 搜集整理  QQ-3335231    E-mail  -   ningyuanbin@163.com.htm (42 of 54)2005-7-9 9:41:49
GCC中文手冊
產生用於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或$28 ),的單字內存訪問指令而非普通的雙字指令.默認情況
下, 用MIPS匯編器時num 是8,而GNU 匯編器則為0.另外, -Gnum 選項也被傳遞 給匯編器和連接器.
所有的模塊必須在相同的-Gnum 值下編譯. 
-nocpp 
匯編用戶匯編文件(帶有`.s'后綴)時,告訴MIPS匯編器不要運行預處理器. 
下面的`-m'選項用於Intel 80386族計算機: -m486 
-mno-486  
控制是否生成對486 優化的代碼. 
-msoft-float 
file:///E|/BOOK/教程資料/Linux/Linhan 搜集整理  QQ-3335231    E-mail  -   ningyuanbin@163.com.htm (44 of 54)2005-7-9 9:41:49
GCC中文手冊
輸出包含浮點庫調用. 警告: 所需庫不是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 
生成的目標碼允許同一個源文件中的函數調用,調用點和被調函數的距離可以超過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-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時,將使用 `libgcc1.c'中的函
數執行浮點運算.除非它們被仿真浮點操作的例程替換,或者類似,它們被編譯為調用 仿真例程,這些
例程將發出浮點操作.如果你為不帶浮點操作的Alpha編譯程序,你必須確保建立了這個庫,以便不
調用 仿真例程. 
file:///E|/BOOK/教程資料/Linux/Linhan 搜集整理  QQ-3335231    E-mail  -   ningyuanbin@163.com.htm (47 of 54)2005-7-9 9:41:49
GCC中文手冊
注意,不帶浮點操作的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-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 
file:///E|/BOOK/教程資料/Linux/Linhan 搜集整理  QQ-3335231    E-mail  -   ningyuanbin@163.com.htm (49 of 54)2005-7-9 9:41:49
GCC中文手冊
即使未初始化的全局變量也分配在目標文件的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). 
另見(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
關於報告差錯的指導請查閱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. 
file:///E|/BOOK/教程資料/Linux/Linhan 搜集整理  QQ-3335231    E-mail  -   ningyuanbin@163.com.htm (53 of 54)2005-7-9 9:41:50
GCC中文手冊
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)
關於GNU CC的奉獻者請查閱GUN CC手冊. 
Linhan  < ningyuanbin@163.com>   
2003/05/13  
file:///E|/BOOK/教程資料/Linux/Linhan 搜集整理  QQ-3335231    E-mail  -   ningyuanbin@163.com.htm (54 of 54)2005-7-9 9:41:50 

[介紹] 


gcc and g++分別是gnu的c & c++編譯器   
gcc/g++在執行編譯工作的時候,總共需要4步   
1.預處理,生成.i的文件  

    預處理器cpp
2.將預處理后的文件不轉換成匯編語言,生成文件.s  

    編譯器egcs
3.有匯編變為目標代碼(機器代碼)生成.o的文件

    匯編器as
4.連接目標代碼,生成可執行程序

    連接器ld

1.總體選項

    -E   
只激活預處理,這個不生成文件,你需要把它重定向到一個輸出文件里   
面.   
例子用法:   
gcc -E hello.c > pianoapan.txt   
gcc -E hello.c | more   
慢慢看吧,一個hello word 也要與處理成800行的代碼      
    -S   
只激活預處理和編譯,就是指把文件編譯成為匯編代碼。   
例子用法   
gcc -S hello.c   
他將生成.s的匯編代碼,你可以用文本編輯器察看     
    -c    
只激活預處理,編譯,和匯編,也就是他只把程序做成obj文件   
例子用法:   
gcc -c hello.c   
他將生成.o的obj文件  

2.目錄選項

   -Idir   
在你是用#include"file"的時候,gcc/g++會先在當前目錄查找你所制定的頭   
文件,如果沒有找到,他回到缺省的頭文件目錄找,如果使用-I制定了目錄,他   
回先在你所制定的目錄查找,然后再按常規的順序去找.   
對於#include,gcc/g++會到-I制定的目錄查找,查找不到,然后將到系   
統的缺省的頭文件目錄查找    

    -include file

    -i

相當於“#include”
包含某個代碼,簡單來說,就是便以某個文件,需要另一個文件的時候,就可以   
用它設定,功能就相當於在代碼中使用#include   
例子用法:   
gcc hello.c -include /root/pianopan.h   
    -I-   
就是取消前一個參數的功能,所以一般在-Idir之后使用   
   -idirafter dir   
在-I的目錄里面查找失敗,講到這個目錄里面查找.   
    -iprefix prefix   
    -iwithprefix dir   
一般一起使用,當-I的目錄查找失敗,會到prefix+dir下查找    
    -Ldir   
制定編譯的時候,搜索庫的路徑。比如你自己的庫,可以用它制定目錄,不然   
編譯器將只在標准庫的目錄找。這個dir就是目錄的名稱。  
    -llibrary    
制定編譯的時候使用的庫   
例子用法   
gcc -lcurses hello.c   
使用ncurses庫編譯程序

 

gcc -l參數和-L參數

 

-l參數就是用來指定程序要鏈接的庫,-l參數緊接着就是庫名,那么庫名跟真正的庫文件名有什么關系呢?

就拿數學庫來說,他的庫名是m,他的庫文件名是libm.so,很容易看出,把庫文件名的頭lib和尾.so去掉就是庫名了

 

好了現在我們知道怎么得到庫名,當我們自已要用到一個第三方提供的庫名字libtest.so,那么我們只要

把libtest.so拷貝到/usr/lib里,編譯時加上-ltest參數,我們就能用上libtest.so庫了

(當然要用libtest.so庫里的函數,我們還需要與libtest.so配套的頭文件) 

放在/lib和/usr/lib和/usr/local/lib里的庫直接用-l參數就能鏈接了,

但如果庫文件沒放在這三個目錄里,而是放在其他目錄里,這時我們只用-l參數的話,鏈接還是會出錯,

出錯信息大概是:“/usr/bin/ld: cannot find -lxxx”,也就是鏈接程序ld在那3個目錄里找不到libxxx.so,

這時另外一個參數-L就派上用場了,比如常用的X11的庫,它在/usr/X11R6/lib目錄下,

我們編譯時就要用-L/usr/X11R6/lib -lX11參數,-L參數跟着的是庫文件所在的目錄名。

再比如我們把libtest.so放在/aaa/bbb/ccc目錄下,那鏈接參數就是-L/aaa/bbb/ccc -ltest

 

另外,大部分libxxxx.so只是一個鏈接,以RH9為例,比如libm.so它鏈接到/lib/libm.so.x,/lib/libm.so.6又鏈接到/lib/libm-2.3.2.so, 

如果沒有這樣的鏈接,還是會出錯,因為ld只會找libxxxx.so,所以如果你要用到xxxx庫,而只有libxxxx.so.x或者libxxxx-x.x.x.so,

做一個鏈接就可以了ln -s libxxxx-x.x.x.so libxxxx.so 

手工來寫鏈接參數總是很麻煩的,還好很多庫開發包提供了生成鏈接參數的程序,名字一般叫xxxx-config,一般放在/usr/bin目錄下,比如

 

gtk1.2的鏈接參數生成程序是gtk-config,執行gtk-config --libs就能得到以下輸出"-L/usr/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic   

3.調試選項

     -g   
只是編譯器,在編譯的時候,產生調試信息。   
    -gstabs   
此選項以stabs格式聲稱調試信息,但是不包括gdb調試信息.   
    -gstabs+   
此選項以stabs格式聲稱調試信息,並且包含僅供gdb使用的額外調試信息.   
    -ggdb    
此選項將盡可能的生成gdb的可以使用的調試信息.

    -glevel

請求生成調試信息,同時用level指出需要多少信息,默認的level值是2

4.鏈接方式選項:

    -static 此選項將禁止使用動態庫。

優點:程序運行不依賴於其他庫

缺點:文件比較大

    -shared (-G) 此選項將盡量使用動態庫,為默認選項

優點:生成文件比較小

缺點:運行時需要系統提供動態庫

    -symbolic 建立共享目標文件的時候,把引用綁定到全局符號上.

對所有無法解析的引用作出警告(除非用連接編輯選項 `-Xlinker -z -Xlinker defs'取代)。

注:只有部分系統支持該選項.

5.錯誤與告警選項

    -Wall 一般使用該選項,允許發出GCC能夠提供的所有有用的警告。也可以用-W{warning}來標記指定的警告。

    -pedantic 允許發出ANSI/ISO C標准所列出的所有警告

    -pedantic-errors 允許發出ANSI/ISO C標准所列出的錯誤

    -werror 把所有警告轉換為錯誤,以在警告發生時中止編譯過程

    -w 關閉所有警告,建議不要使用此項

6.預處理選項

    -Dmacro   
相當於C語言中的#define macro   
    -Dmacro=defn   
相當於C語言中的#define macro=defn   
    -Umacro   
相當於C語言中的#undef macro   
    -undef   
取消對任何非標准宏的定義 

7.其他選項

    -o

制定目標名稱,缺省的時候,gcc 編譯出來的文件是a.out,很難聽,如果你和我有同感,改掉它,哈哈

例子用法   
gcc -o hello.exe hello.c (哦,windows用習慣了)   
gcc -o hello.asm -S hello.c   
    -O0   
    -O1   
    -O2   
    -O3   
編譯器的優化選項的4個級別,-O0表示沒有優化,-O1為缺省值,-O3優化級別最高

    -fpic 編譯器就生成位置無關目標碼.適用於共享庫(shared library).

    -fPIC 編譯器就輸出位置無關目標碼.適用於動態連接(dynamic linking),即使分支需要大范圍轉移.

    -v 顯示詳細的編譯、匯編、連接命令
    -pipe   
使用管道代替編譯中臨時文件,在使用非gnu匯編工具的時候,可能有些問題   
gcc -pipe -o hello.exe hello.c   
    -ansi   
關閉gnu c中與ansi c不兼容的特性,激活ansi c的專有特性(包括禁止一些asm inline typeof關鍵字,以及UNIX,vax等預處理宏,   
    -fno-asm   
此選項實現ansi選項的功能的一部分,它禁止將asm,inline和typeof用作關鍵字。   
    -fno-strict-prototype   
只對g++起作用,使用這個選項,g++將對不帶參數的函數,都認為是沒有顯式的對參數的個數和類型說明,而不是沒有參數.而gcc無論是否使用這個參數,都將對沒有帶參數的函數,認為城沒有顯式說明的類型   
    -fthis-is-varialble   
就是向傳統c++看齊,可以使用this當一般變量使用.   
    -fcond-mismatch   
允許條件表達式的第二和第三參數類型不匹配,表達式的值將為void類型   
    -funsigned-char   
    -fno-signed-char   
    -fsigned-char   
    -fno-unsigned-char   
這四個參數是對char類型進行設置,決定將char類型設置成unsigned char(前   
兩個參數)或者 signed char(后兩個參數) 
    -imacros file   
將file文件的宏,擴展到gcc/g++的輸入文件,宏定義本身並不出現在輸入文件中       
    -nostdinc   
使編譯器不再系統缺省的頭文件目錄里面找頭文件,一般和-I聯合使用,明確限定頭文件的位置   
    -nostdin C++   
規定不在g++指定的標准路經中搜索,但仍在其他路徑中搜索,.此選項在創建libg++庫使用   
    -C   
在預處理的時候,不刪除注釋信息,一般和-E使用,有時候分析程序,用這個很方便的   
    -M   
生成文件關聯的信息。包含目標文件所依賴的所有源代碼你可以用gcc -M hello.c來測試一下,很簡單。   
    -MM   
和上面的那個一樣,但是它將忽略由#include造成的依賴關系。   
    -MD   
和-M相同,但是輸出將導入到.d的文件里面   
    -MMD   
和-MM相同,但是輸出將導入到.d的文件里面   
    -Wa,option   
此選項傳遞option給匯編程序;如果option中間有逗號,就將option分成多個選項,然后傳遞給會匯編程序   
    -Wl.option   
此選項傳遞option給連接程序;如果option中間有逗號,就將option分成多個選項,然后傳遞給會連接程序.

    -x language filename   

設定文件所使用的語言,使后綴名無效,對以后的多個有效.也就是根   
據約定C語言的后綴名稱是.c的,而C++的后綴名是.C或者.cpp,如果   
你很個性,決定你的C代碼文件的后綴名是.pig 哈哈,那你就要用這   
個參數,這個參數對他后面的文件名都起作用,除非到了下一個參數   
的使用。   
可以使用的參數嗎有下面的這些   
`c’, `objective-c’, `c-header’, `c++’, `cpp-output’,    
`assembler’, and `assembler-with-cpp’.   
看到英文,應該可以理解的。   
例子用法:   
gcc -x c hello.pig   
    -x none filename   
關掉上一個選項,也就是讓gcc根據文件名后綴,自動識別文件類型   
例子用法:   
gcc -x c hello.pig -x none hello2.c


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM