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 -ffreestanding -fno-freestanding -fno-strict-prototype -fsigned-bitfields -fsigned-char -fthis-is-variable -funsigned-bitfields -funsigned-char -fwritable-strings -traditional -traditional-cpp -trigraphs 警告選項(Warning Option)
- -fsyntax-only -pedantic -pedantic-errors -w -W -Wall -Waggregate-return -Wcast-align -Wcast-qual -Wchar-subscript -Wcomment -Wconversion -Wenum-clash -Werror -Wformat -Wid-clash-len -Wimplicit -Wimplicit-int -Wimplicit-function-declaration -Winline -Wlong-long -Wmain -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -Wno-import -Wparentheses -Wpointer-arith -Wredundant-decls -Wreturn-type -Wshadow -Wstrict-prototypes -Wswitch -Wtemplate-debugging -Wtraditional -Wtrigraphs -Wuninitialized -Wunused -Wwrite-strings 調試選項(Debugging Option)
- -a -dletters -fpretend-float -g -glevel -gcoff -gxcoff -gxcoff+ -gdwarf -gdwarf+ -gstabs -gstabs+ -ggdb -p -pg -save-temps -print-file-name=library -print-libgcc-file-name -print-prog-name=program 優化選項(Optimization Option)
- -fcaller-saves -fcse-follow-jumps -fcse-skip-blocks -fdelayed-branch -felide-constructors -fexpensive-optimizations -ffast-math -ffloat-store -fforce-addr -fforce-mem -finline-functions -fkeep-inline-functions -fmemoize-lookups -fno-default-inline -fno-defer-pop -fno-function-cse -fno-inline -fno-peephole -fomit-frame-pointer -frerun-cse-after-loop -fschedule-insns -fschedule-insns2 -fstrength-reduce -fthread-jumps -funroll-all-loops -funroll-loops -O -O2 -O3 預處理器選項(Preprocessor Option)
- -Aassertion -C -dD -dM -dN -Dmacro[=defn] -E -H -idirafterdir -include file -imacros file -iprefix file -iwithprefixdir -M -MD -MM -MMD -nostdinc -P -Umacro -undef 彙編器選項(Assembler Option)
- -Wa,option 連接配接器選項(Linker Option)
- -llibrary -nostartfiles -nostdlib -static -shared -symbolic -Xlinker option -Wl,option -usymbol 目錄選項(Directory Option)
- -Bprefix -Idir -I- -Ldir 目标機選項(Target Option)
- -b machine -V version 配置相關選項(Configuration Dependent Option)
-
M680x0 選項
-m68000 -m68020 -m68020-40 -m68030 -m68040 -m68881 -mbitfield -mc68000 -mc68020 -mfpa -mnobitfield -mrtd -mshort -msoft-float
VAX選項
-mg -mgnu -munix
SPARC選項
-mepilogue -mfpu -mhard-float -mno-fpu -mno-epilogue -msoft-float -msparclite -mv8 -msupersparc -mcypress
Convex選項
-margcount -mc1 -mc2 -mnoargcount
AMD29K選項
-m29000 -m29050 -mbw -mdw -mkernel-registers -mlarge -mnbw -mnodw -msmall -mstack-check -muser-registers
M88K選項
-m88000 -m88100 -m88110 -mbig-pic -mcheck-zero-division -mhandle-large-shift -midentify-revision -mno-check-zero-division -mno-ocs-debug-info -mno-ocs-frame-position -mno-optimize-arg-area -mno-serialize-volatile -mno-underscores -mocs-debug-info -mocs-frame-position -moptimize-arg-area -mserialize-volatile -mshort-data-num -msvr3 -msvr4 -mtrap-large-shift -muse-div-instruction -mversion-03.00 -mwarn-passed-structs
RS6000選項
-mfp-in-toc -mno-fop-in-toc
RT選項
-mcall-lib-mul -mfp-arg-in-fpregs -mfp-arg-in-gregs -mfull-fp-blocks -mhc-struct-return -min-line-mul -mminimum-fp-blocks -mnohc-struct-return
MIPS選項
-mcpu=cpu type -mips2 -mips3 -mint64 -mlong64 -mmips-as -mgas -mrnames -mno-rnames -mgpopt -mno-gpopt -mstats -mno-stats -mmemcpy -mno-memcpy -mno-mips-tfile -mmips-tfile -msoft-float -mhard-float -mabicalls -mno-abicalls -mhalf-pic -mno-half-pic -G num -nocpp
i386選項
-m486 -mno-486 -msoft-float -mno-fp-ret-in-387
HPPA選項
-mpa-risc-1-0 -mpa-risc-1-1 -mkernel -mshared-libs -mno-shared-libs -mlong-calls -mdisable-fpregs -mdisable-indexing -mtrailing-colon
i960選項
-mcpu-type -mnumerics -msoft-float -mleaf-procedures -mno-leaf-procedures -mtail-call -mno-tail-call -mcomplex-addr -mno-complex-addr -mcode-align -mno-code-align -mic-compat -mic2.0-compat -mic3.0-compat -masm-compat -mintel-asm -mstrict-align -mno-strict-align -mold-align -mno-old-align
DEC Alpha選項
-mfp-regs -mno-fp-regs -mno-soft-float -msoft-float
System V選項
-G -Qy -Qn -YP,paths -Ym,dir
代碼生成選項(Code Generation Option) - -fcall-saved-reg -fcall-used-reg -ffixed-reg -finhibit-size-directive -fnonnull-objects -fno-common -fno-ident -fno-gnu-linker -fpcc-struct-return -fpic -fPIC -freg-struct-return -fshared-data -fshort-enums -fshort-double -fvolatile -fvolatile-global -fverbose-asm
總體選項(Overall Option)
- -xlanguage
- 明确指出後面輸入檔案的語言為 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'選項一起才 有意義,因為他們的輸出結果不能用于編譯.
- -includefile
- 在處理正常輸入檔案之前 , 首先處理檔案 file, 其結果是 , 檔案 file 的内容先得到編譯 . 指令行上任何 `-D' 和 `-U' 選項永遠在 `-includefile' 之前處理 , 無論他們在指令行上的順序如何 . 然而 `-include' 和 `-imacros' 選項按書寫順序處理 . -imacros file
- 在處理正常輸入檔案之前 , 首先處理檔案 file, 但是忽略輸出結果 . 由于丢棄了檔案 file 的 輸出内容 , `-imacrosfile' 選項的唯一效果就是使檔案 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' 選項類似 , 但是輸出結果僅涉及使用者頭檔案 , 象這樣 `#includefile"'. 忽略系統頭檔案如 `#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' 選項類似 , 但是忽略宏的參量或内容 . 隻在輸出端顯示 `#definename.
彙編器選項(ASSEMBLER OPTION)
- -Wa,option
- 把選項 option 傳遞給彙編器 . 如果 option 含有逗号 , 就在逗号處分割成多個選項 .
連接配接器選項(LINKER OPTION)
下面的選項用于編譯器連接配接目标檔案 , 輸出可執行檔案的時候 . 如果編譯器不進行 連接配接 , 他們就毫無意義 .
- object-file-name
- 如果某些檔案沒有特别明确的字尾 a special recognized suffix, GCC 就認為他們是目标檔案或庫檔案 . ( 根據檔案内容 , 連接配接器能夠區分目标檔案和庫檔案 ). 如果 GCC 執行連接配接操作 , 這些目标檔案将成為連接配接器的輸入檔案 . -llibrary
-
連接配接名為 library 的庫檔案 .
連接配接器在标準搜尋目錄中尋找這個庫檔案,庫檔案的真正名字是`liblibrary.a'.連接配接器會 當做檔案名得到準确說明一樣引用這個檔案.
搜尋目錄除了一些系統标準目錄外,還包括使用者以`-L'選項指定的路徑.
一般說來用這個方法找到的檔案是庫檔案---即由目标檔案組成的歸檔檔案(archive file).連接配接器處理歸檔檔案的 方法是:掃描歸檔檔案,尋找某些成員,這些成員的符号目前已被引用,不過還沒有被定義.但是,如果連接配接器找到普通的 目标檔案,而不是庫檔案,就把這個目标檔案按平常方式連接配接進來.指定`-l'選項和指定檔案名的唯一差別是, `-l選項用`lib'和`.a'把library包裹起來,而且搜尋一些目錄.
-lobjc - 這個 -l 選項的特殊形式用于連接配接 Objective C 程式 . -nostartfiles
- 不連接配接系統标準啟動檔案 , 而标準庫檔案仍然正常使用 . -nostdlib
- 不連接配接系統标準啟動檔案和标準庫檔案 . 隻把指定的檔案傳遞給連接配接器 . -static
- 在支援動态連接配接 (dynamic linking) 的系統上 , 阻止連接配接共享庫 . 該選項在其他系統上無效 . -shared
- 生成一個共享目标檔案 , 他可以和其他目标檔案連接配接産生可執行檔案 . 隻有部分系統支援該選項 . -symbolic
- 建立共享目标檔案的時候 , 把引用綁定到全局符号上 . 對所有無法解析的引用作出警告 ( 除非用連接配接編輯選項 `-Xlinker -z -Xlinker defs' 取代 ). 隻有部分系統支援該選項 . -Xlinker option
-
把選項 option 傳遞給連接配接器 . 可以用他傳遞系統特定的連接配接選項 , GNU CC 無法識别這些選項 .
如果需要傳遞攜帶參數的選項,你必須使用兩次`-Xlinker',一次傳遞選項,另一次傳遞他的參數.例如,如果傳遞`-assert definitions',你必須寫成`-Xlinker -assert -Xlinker definitions',而不能寫成`-Xlinker "-assert definitions"',因為這樣會把整個 字元串當做一個參數傳遞,顯然這不是連接配接器期待的.
-Wl,option - 把選項 option 傳遞給連接配接器 . 如果 option 中含有逗号 , 就在逗号處分割成多個選項 . -u symbol
- 使連接配接器認為取消了 symbol 的符号定義 , 進而連接配接庫子產品以取得定義 . 你可以使用多個 `-u' 選項 , 各自跟上不同的符号 , 使得連接配接器調入附加的庫子產品 .
目錄選項(DIRECTORY OPTION)
下列選項指定搜尋路徑 , 用于查找頭檔案 , 庫檔案 , 或編譯器的某些成員 :
- -Idir
- 在頭檔案的搜尋路徑清單中添加 dir 目錄 . -I-
-
任何在 `-I-' 前面用 `-I' 選項指定的搜尋路徑隻适用于 `#include "file"' 這種情況 ; 他們不能用來搜尋 `#include <file>' 包含的頭檔案 .
如果用`-I'選項指定的搜尋路徑位于`-I-'選項後面,就可以在這些路徑中搜尋所有的`#include'指令. (一般說來-I選項就是這麼用的.)
還有, `-I-'選項能夠阻止目前目錄(存放目前輸入檔案的地方)成為搜尋`#include "file"'的第一選擇.沒有辦法克服`-I-'選項的這個效應.你可以指定`-I.'搜尋那個目錄,它在調用編譯器時是目前目錄.這和預處理器的預設行為不完全一樣,但是結果通常 令人滿意.
`-I-'不影響使用系統标準目錄,是以, `-I-'和`-nostdinc'是不同的選項.
-Ldir - 在 `-l' 選項的搜尋路徑清單中添加 dir 目錄 . -Bprefix
-
這個選項指出在何處尋找可執行檔案 , 庫檔案 , 以及編譯器自己的資料檔案 .
編譯器驅動程式需要執行某些下面的子程式: `cpp', `cc1' (或C++的`cc1plus'), `as'和`ld'.他把prefix當作欲執行的程式的 字首,既可以包括也可以不包括`machine/version/'.
對于要運作的子程式,編譯器驅動程式首先試着加上`-B'字首(如果存在).如果沒有找到檔案,或沒有指定`-B'選項,編譯器接着會試驗兩個标準字首`/usr/lib/gcc/'和`/usr/local/lib/gcc-lib/'.如果仍然沒能夠找到所需檔案,編譯器就在`PATH'環境變量 指定的路徑中尋找沒加任何字首的檔案名.
如果有需要,運作時(run-time)支援檔案`libgcc.a'也在`-B'字首的搜尋範圍之内.如果這裡沒有找到,就在上面提到的兩個标準字首中尋找,僅此而已.如果上述方法沒有找到這個檔案,就不連接配接他了.多數 情況的多數機器上, `libgcc.a'并非必不可少.
你可以通過環境變量GCC_EXEC_PREFIX獲得近似的效果;如果定義了這個變量,其值就和上面說的 一樣用做字首.如果同時指定了`-B'選項和GCC_EXEC_PREFIX變量,編譯器首先使用`-B'選項,然後才嘗試環境變量值.
警告選項(WARNING OPTION)
警告是針對程式結構的診斷資訊 , 程式不一定有錯誤 , 而是存在風險 , 或者可能存在 錯誤 .
下列選項控制GNU CC産生的警告的數量和類型:
- -fsyntax-only
- 檢查程式中的文法錯誤 , 但是不産生輸出資訊 . -w
- 禁止所有警告資訊 . -Wno-import
- 禁止所有關于 #import 的警告資訊 . -pedantic
-
打開完全服從 ANSI C 标準所需的全部警告診斷 ; 拒絕接受采用了被禁止的文法擴充的程式 .
無論有沒有這個選項,符合ANSI C标準的程式應該能夠被正确編譯(雖然極少數程式需要`-ansi'選項).然而,如果沒有這個選項,某些GNU擴充和傳統C特性也得到支援.使用這個選項可以拒絕這些程式.沒有理由 使用這個選項,他存在隻是為了滿足一些書呆子(pedant).
對于替選關鍵字(他們以`__'開始和結束) `-pedantic'不會産生警告資訊. Pedantic也不警告跟在__extension__後面的表達式.不過隻應該在系統頭檔案中使用這種轉義措施,應用程式最好 避免.
-pedantic-errors - 該選項和 `-pedantic' 類似 , 但是顯示錯誤而不是警告 . -W
- 對下列事件顯示額外的警告資訊 : *
-
非易變自動變量 (nonvolatile automatic variable) 可能在調用 longjmp 時發生改變 . 這些警告僅在優化編譯時發生 .
編譯器隻知道對setjmp的調用,他不可能知道會在哪裡調用longjmp,事實上一個 信号處理例程可以在程式的任何地點調用他.其結果是,即使程式沒有問題,你也可能會得到警告,因為無法在可能出現問題 的地方調用longjmp.
* - 既可以傳回值 , 也可以不傳回值的函數 . ( 缺少結尾的函數體被看作不傳回函數值 ) 例如 , 下面的函數将導緻這種警告 :
由于 GNU CC 不知道某些函數永不傳回 ( 含有 abort 和 longjmp), 是以有可能出現 虛假警告 .foo (a) { if (a > 0) return a; }
* - 表達式語句或逗号表達式的左側沒有産生作用 (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還沒有智能到判别所有的情況,知道有些看上去錯誤的代碼其實是正确的.下面是 一個這樣的例子:
如果 y 始終是 1, 2 或 3, 那麼 x 總會被初始化 , 但是 GNU CC 不知道這一點 . 下面是 另一個普遍案例 :{ int x; switch (y) { case 1: x = 1; break; case 2: x = 4; break; case 3: x = 5; } foo (x); }
{ 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 期待的 . 最終 GNUgprof 将處理這些資料 . -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可以共存.其中一個版本(可能是最新的那個)為預設版本,但是有時候你希望使用 其他版本.
- -bmachine
-
參數 machine 指出編譯的目标機種 . 這個選項用于安裝為交叉編譯器的 GNU CC.
參數machine的值和配置GNU CC交叉編譯器時設定的機器類型一樣.例如,如果交叉編譯器配置有`configure i386v',意思是編譯80386上的System V目标碼,那麼你可以通過`-b i386v'運作交叉編譯器.
如果沒有指定`-b'選項,通常指編譯本機目标碼.
-V version -
參數 version 指出運作哪個版本的 GNU CC. 這個選項用于安裝了多個版本的 GCC. 例如 , 如果 version 是 `2.0', 意味着運作 GNU CC 2.0 版 .
如果沒有指定`-V'選項,預設版本取決于GNU CC的安裝方式,一般說來推薦使用通用版本.
機器相關選項(MACHINE DEPENDENT OPTION)
每一種目标機型都有自己的特别選項 , 這些選項用 `-m' 開關引導 , 選擇不同的硬體型号或配置 --- 例如 , 68010 還是 68020, 有沒有浮點協處理器 . 通過指定選項 , 安裝 編譯器的一個版本能夠為所有的型号或配置進行編譯 .
此外,編譯器的某些配置支援附加的特殊選項,通常是為了在指令行上相容這個平台的其他編譯器.
下面是針對68000系列定義的`-m'選項:
- -m68000 -mc68000
- 輸出 68000 的目标碼 . 如果編譯器按基于 68000 的系統配置 , 這個選項就是預設選項 . -m68020 -mc68020
- 輸出 68020 的目标碼 ( 而不是 68000). 如果編譯器按基于 68020 的系統配置 , 這個選項就是預設選項 . -m68881
- 輸出包含 68881 浮點指令的目标碼 . 對于大多數基于 68020 的系統這是預設選項 , 除非設定編譯器時指定了 -nfp . -m68030
- 輸出 68030 的目标碼 . 如果編譯器按基于 68030 的系統配置 , 這個選項就是預設選項 . -m68040
- 輸出 68040 的目标碼 . 如果編譯器按基于 68040 的系統配置 , 這個選項就是預設選項 . -m68020-40
- 輸出 68040 的目标碼 , 但是不使用新指令 . 生成的代碼可以在 68020/68881 上 , 也可以在 68030 或 68040 上較有效地運作 . -mfpa
- 輸出包含 SUN FPA 浮點指令的目标碼 . -msoft-float
- 輸出包含浮點庫調用的目标碼 . 警告: 所需的庫不是 GNU CC 的組成部分 . 一般說來 GCC 使用該機型本地 C 編譯器的相應部件 , 但是作交叉編譯時卻不能直接使用 . 你必須自己管理提供合适的函數庫用于交叉編譯 . -mshort
- 認為 int 類型是 16 位寬 , 相當于 short int. -mnobitfield
- 不使用位域 (bit-field) 指令 . `-m68000' 隐含指定了 `-mnobitfield'. -mbitfield
- 使用位域指令 . `-m68020' 隐含指定了 `-mbitfield'. 如果你使用未改裝的 gcc, 這就是 預設選項 . -mrtd
-
采用另一種函數調用約定 , 函數接受固定數目的參數 , 用 rtd 指令傳回 , 該指令傳回時彈出棧内的參數 . 這個 方法能夠使調用者節省一條指令 , 因為他這裡不需要彈出參數 .
這種調用約定不相容UNIX的正常調用.是以如果你需要調用UNIX編譯器編譯的庫函數,你就不能使用這個選項.
此外,所有參數數量可變地函數必須提供函數原型(包括printf);否則編譯器會生成錯誤的調用代碼.
另外,如果調用函數時攜帶了過多的參數,編譯器将生成嚴重錯誤的代碼. (正常情況下,多餘的參數被安全無害的忽略.)
68010和68020處理器支援rtd指令,但是68000不支援.
下面是針對VAX定義的`-m'選項:
- -munix
- 禁止輸出某些跳轉指令 (aobleq 等等 ), VAX 的 UNIX 彙編器無法跨越長範圍 (long ranges) 進行處理 . -mgnu
- 如果使用 GNU 彙編器 , 則輸出那些跳轉指令 , -mg
- 輸出 g-format 浮點數 , 取代 d-format.
下面是SPARC支援的`-m'選項開關:
-mfpu
- -mhard-float
- 輸出包含浮點指令的目标碼 . 這是預設選項 .
-mno-fpu
- -msoft-float
-
輸出包含浮點庫調用的目标碼 . 警告: 沒有為 SPARC 提供 GNU 浮點庫 . 一般說來使用該機型本地 C 編譯器 的相應部件 , 但是不能直接用于交叉編譯 . 你必須自己安排 , 提供用于交叉編譯的庫函數 .
-msoft-float改變了輸出檔案中的調用約定;是以隻有用這個選項編譯整個程式才有意義.
-mno-epilogue
- -mepilogue
-
使用 -mepilogue ( 預設 ) 選項時 , 編譯器總是把函數的退出代碼放在函數的尾部 . 任何在函數中間 的退出語句 ( 例如 C 中的 return 語句 ) 将産生出跳轉指令指向函數尾部 .
使用-mno-epilogue選項時,編譯器盡量在每個函數退出點嵌入退出代碼.
-mno-v8
- -mv8 -msparclite
-
這三個選項選擇不同種類的 SPARC 系統 .
預設情況下(除非特别為Fujitsu SPARClite配置), GCC生成SPARC v7目标碼.
-mv8生成SPARC v8目标碼.他和v7目标碼唯一的差別是,編譯器生成整數乘法和整數除法指令, SPARC v8支援該指令,而v7體系不支援.
-msparclite生成SPARClite目标碼.增加了SPARClite支援的整數乘法,整數除法單步掃描(integer divide step and scan (ffs))指令. v7體系不支援這些指令.
-mcypress
- -msupersparc
-
這兩個選項選擇處理器型号 , 針對處理器進行代碼優化 .
-mcypress選項(預設項)使編譯器對Cypress CY7C602晶片優化代碼, SparcStation/SparcServer 3xx系列使用這種晶片.該選項也适用于老式的SparcStation 1, 2, IPX 等機型..
-msupersparc選項使編譯器對SuperSparc處理器優化代碼, SparcStation 10, 1000 和2000系列使用這種晶片.同時該選項啟用完整的SPARC v8指令集.
下面是針對Convex定義的`-m'選項:
- -mc1
- 輸出 C1 的目标碼 . 當編譯器對 C1 配置時 , 這是預設選項 . -mc2
- 輸出 C2 的目标碼 . 當編譯器對 C2 配置時 , 這是預設選項 . -margcount
- 在每個參數清單的前面放置一個參數計數字 (argument count word). 某些不可移植的 Convex 和 Vax 程式需要這個參數計數字 . ( 調試器不需要他 , 除非函數帶有變長參數清單 ; 這個資訊存放在符号表中 .) -mnoargcount
- 忽略參數計數字 . 如果你使用未改裝的 gcc, 這是預設選項 .
下面是針對AMD Am29000定義的`-m'選項:
- -mdw
- 生成的目标碼認為 DW 置位 , 就是說 , 位元組和半字操作由硬體直接支援 . 該選項是預設選項 . -mnodw
- 生成的目标碼認為 DW 沒有置位 . -mbw
- 生成的目标碼認為系統支援位元組和半字寫操作 . 該選項是預設選項 . -mnbw
- 生成的目标碼認為系統不支援位元組和半字寫操作 . 該選項隐含開啟了 `-mnodw' 選項 . -msmall
- 使用小記憶體模式 , 小記憶體模式假設所有函數的位址位于某個 256 KB 段内 , 或者所有函數的絕對位址小于 256K. 這樣 就可以用 call 指令代替 const,consth, calli 指令序列 . -mlarge
- 假設不能使用 call 指令 ; 這是預設選項 . -m29050
- 輸出 Am29050 的目标碼 . -m29000
- 輸出 Am29000 的目标碼 . 這是預設選項 . -mkernel-registers
-
生成的目标碼引用 gr64-gr95 寄存器而不是 gr96-gr127 寄存器 . 該選項可以用于編譯 核心代碼 , 核心需要一組全局寄存器 , 這些全局寄存器和使用者模式使用的寄存器完全無關 .
注意,使用這個選項時, `-f'選項中的寄存器名字必須是normal, user-mode, names.
-muser-registers - 使用普通全局寄存器集 gr96-gr127. 這是預設選項 . -mstack-check
- 在每次堆棧調整後插入一條 __msp_check 調用 . 這個選項常用于核心代碼 .
下面是針對Motorola 88K體系定義的`-m'選項:
- -m88000
- 生成的目标碼可以在 m88100 和 m88110 上正常工作 . -m88100
- 生成的目标碼在 m88100 上工作的最好 , 但也可以在 m88110 上運作 . -m88110
- 生成的目标碼在 m88110 上工作的最好 , 可能不能在 m88100 上運作 . -midentify-revision
- 在彙編器的輸出端包含一條 ident 指令 , 記錄源檔案名 , 編譯器名字和版本 , 時标 , 以及使用的編譯選項 , -mno-underscores
- 在彙編器的輸出端 , 符号名字前面不添加下劃線 . 預設情況是在每個名字前面增加下劃線字首 . -mno-check-zero-division -mcheck-zero-division
- 早期型号的 88K 系統在除零操作上存在問題 , 特定情況下許多機器無法自陷 . 使用這些選項可以避免包含 ( 或可以 顯明包含 ) 附加的代碼 , 這些代碼能夠檢查除零錯 , 發送例外信号 . GCC 所有 88K 的配置預設使用 `-mcheck-zero-division' 選項 . -mocs-debug-info -mno-ocs-debug-info
- 包含 ( 或忽略 ) 附加的調試資訊 ( 關于每個棧架結構中寄存器的使用 ), 88Open Object Compatibility Standard, ``OCS'', 對此資訊做了說明 . GDB 不需要這些額外資訊 . DG/UX, SVr4, 和 Delta 88 SVr3.2 的預設配置是包含調試資訊 , 其他 88k 機型的預設配置是忽略這個資訊 . -mocs-frame-position -mno-ocs-frame-position
- 強制 ( 或不要求 ) 把寄存器值存儲到棧架結構中的指定位置 ( 按 OCS 的說明 ). DG/UX, Delta88 SVr3.2 和 BCS 的預設配置使用 `-mocs-frame-position' 選項 ; 其他 88k 機型的預設配置是 `-mno-ocs-frame-position'. -moptimize-arg-area -mno-optimize-arg-area
- 控制如何在堆棧結構中存儲函數參數 . `-moptimize-arg-area' 節省空間 , 但是有可能宕掉某些 調試器 ( 不是 GDB). `-mno-optimize-arg-area' 證明比标準選項好 . 預設情況下 GCC 不優化參數域 . -mshort-data-
- num 通過和 r0 關聯 , 産生較小的資料引用 (data reference), 這樣就可以用單指令調入 一個數值 ( 而不是平常的雙指令 ). 使用者通過選項中的 num 控制改變哪種資料引用 . 例如 , 如果你指定了 `-mshort-data-512', 那麼受影響的資料引用是小于 512 位元組的資料移動 .-mshort-data-num 選項對大于 64K 的 num 無效 .
-mserialize-volatile
- -mno-serialize-volatile
-
産生 , 或不産生代碼來保證對易變記憶體通路的結果一緻 .
對于常用的處理器子型号, GNU CC始終預設保證這種一緻性.如何實作結果一緻取決于處理器子型号.
m88100處理器不對記憶體引用重新安排,是以通路結果始終一緻.如果使用了`-m88100'選項, GNU CC 不産生任何針對結果一緻的特别指令.
m88110處理器的記憶體引用順序并不始終符合指令請求的引用順序.特别是某條讀取指令可能在先前的存儲指令之前執行.多處理器環境下,亂序通路擾亂了易變記憶體通路的結果一緻.是以當使用`-m88000'或`-m88110'選項時, GNU CC在适當的時候産生特别的指令迫使執行順序正确.
這些用于保證一緻性的額外代碼有可能影響程式的性能.如果你确認能夠安全地放棄這種保證,你可以使用`-mno-serialize-volatile'選項.
如果你使用`-m88100'選項,但是需要在m88110處理器上運作時的結果一緻,你應該加上`-mserialize-volatile'選項.
-msvr4
- -msvr3
- 打開 (`-msvr4') 或關閉 (`-msvr3') 和 System V 第四版 (SVr4) 相關的 編譯器擴充 . 效果如下 : *
- 輸出哪種彙編文法 ( 你可以使用 `-mversion-03.00' 選項單獨選擇 ). *
- `-msvr4' 使 C 預處理器識别 `#pragma weak' 指令 *
- `-msvr4' 使 GCC 輸出額外的聲明指令 (declaration directive), 用于 SVr4.
除了SVr4配置, `-msvr3'是所有m88K配置的預設選項.
- -mtrap-large-shift -mhandle-large-shift
- 包含一些指令 , 用于檢測大于 31 位的位移 (bit-shift); 根據相應的選項 , 對這樣的位移發出自陷 (trap) 或執行适當的處理代碼 . 預設情況下 , GCC 對大位移不做特别處理 . -muse-div-instruction
- 很早以前的 88K 型号沒有 (div) 除法指令 , 是以預設情況下 GCC 避免産生這條指令 . 而這個選項告訴 GCC 該指令是 安全的 . -mversion-03.00
- 在 DG/UX 配置中存在兩種風格的 SVr4. 這個選項修改 -msvr4 , 選擇 hybrid-COFF 或 real-ELF 風格 . 其他配置均忽略該選項 . -mwarn-passed-structs
- 如果某個函數把結構當做參數或結果傳遞 , GCC 發出警告 . 随着 C 語言的發展 , 人們已經改變了傳遞結構的約定 , 它往往導緻移植問題 . 預設情況下 , GCC 不會發出警告 .
下面的選項用于IBM RS6000:
-mfp-in-toc
- -mno-fp-in-toc
- 控制是否把浮點常量放到内容表 (TOC) 中 , 内容表存放所有的全局變量和函數位址 . 預設情況下 , GCC 把浮點常量放到 這裡 ; 如果 TOC 溢出 , `-mno-fp-in-toc' 選項能夠減少 TOC 的大小 , 這樣就可以避免溢出 .
下面的`-m'選項用于IBM RT PC:
- -min-line-mul
- 對于整數乘法使用嵌入代碼 . 這是預設選項 . -mcall-lib-mul
- 對于整數乘法使用 lmul$$ . -mfull-fp-blocks
- 生成全尺寸浮點資料塊 , 包括 IBM 建議的最少數量的活動空間 (scratch space). 這是預設選項 . -mminimum-fp-blocks
- 不要在浮點資料塊中包括額外的活動空間 . 這樣就産生較小但是略慢的可執行程式 , 因為活動空間必須動态配置設定 . -mfp-arg-in-fpregs
- 采用不相容 IBM 調用約定的調用序列 , 通過浮點寄存器傳送浮點參數 . 注意 , 如果指定了這個選項 ,varargs.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
- 産生用于 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
-
輸出包含浮點庫調用 . 警告: 所需庫不是 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 編譯程式 , 你必須確定建立了這個庫 , 以便不調用 仿真例程 .
注意,不帶浮點操作的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
- 即使未初始化的全局變量也配置設定在目标檔案的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.
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手冊.
[中文版維護人]
徐明<[email protected]>
[中文版最新更新]
2003/05/13第一版
《中國Linux論壇man手冊頁翻譯計劃》
http://cmpp.linuxforum.net/
Index
- NAME 總覽 (SYNOPSIS) 警告 (WARNING) 描述 (DESCRIPTION) 選項 (OPTIONS) 總體選項 (Overall Option) 語言選項 (LANGUAGE OPTIONS) 預處理器選項 (Preprocessor Option) 彙編器選項 (ASSEMBLER OPTION) 連接配接器選項 (LINKER OPTION) 目錄選項 (DIRECTORY OPTION) 警告選項 (WARNING OPTION) 調試選項 (DEBUGGING OPTION) 優化選項 (OPTIMIZATION OPTION) 目标機選項 (TARGET OPTION) 機器相關選項 (MACHINE DEPENDENT OPTION) 代碼生成選項 (CODE GENERATION OPTION) PRAGMAS 檔案 (FILE) 另見 (SEE ALSO) BUGS 版權 (COPYING) 作者 (AUTHORS) [中文版維護人] [中文版最新更新] 《中國Linux論壇man手冊頁翻譯計劃》
This document was created byman2html, using the manual pages.
Time: GMT, January 14, 2004