GCC中文手冊

GCC 1c++

NAME程序員

gcc,g++-GNU工程的C和C++編譯器(egcs-1.1.2)objective-c

總覽(SYNOPSIS)express

gcc[option|filename ]...
g++[option|filename ]...數組

警告(WARNING)緩存

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

除非有人自願維護,不然本手冊頁再也不更新.若是發現手冊頁和軟件之間有所矛盾,請查對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.oop

描述(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 -idirafter dir -include file -imacros file -iprefix file -iwithprefix dir -M -MD -MM -MMD -nostdinc -P -Umacro -undef

彙編器選項(Assembler Option)

-Wa,option

鏈接器選項(Linker Option)

-llibrary -nostartfiles -nostdlib -static -shared -symbolic -Xlinker option -Wl,option -u symbol

目錄選項(Directory Option)

-Bprefix -Idir -I- -Ldir

目標機選項(Target Option)

-b machine -V version

配置相關選項(Configuration Dependent Option)

M680x0 選項
-m68000 -m68020 -m68020-40 -m68030 -m68040 -m68881 -mbitfield -mc68000 -mc68020 -mfpa -mnobitfield -mrtd -mshort -msoft-float

VAX選項
-mg -mgnu -munix

SPARC選項
-mepilogue -mfpu -mhard-float -mno-fpu -mno-epilogue -msoft-float -msparclite -mv8 -msupersparc -mcypress

Convex選項
-margcount -mc1 -mc2 -mnoargcount

AMD29K選項
-m29000 -m29050 -mbw -mdw -mkernel-registers -mlarge -mnbw -mnodw -msmall -mstack-check -muser-registers

M88K選項
-m88000 -m88100 -m88110 -mbig-pic -mcheck-zero-division -mhandle-large-shift -midentify-revision -mno-check-zero-division -mno-ocs-debug-info -mno-ocs-frame-position -mno-optimize-arg-area -mno-serialize-volatile -mno-underscores -mocs-debug-info -mocs-frame-position -moptimize-arg-area -mserialize-volatile -mshort-data-num -msvr3 -msvr4 -mtrap-large-shift -muse-div-instruction -mversion-03.00 -mwarn-passed-structs

RS6000選項
-mfp-in-toc -mno-fop-in-toc

RT選項
-mcall-lib-mul -mfp-arg-in-fpregs -mfp-arg-in-gregs -mfull-fp-blocks -mhc-struct-return -min-line-mul -mminimum-fp-blocks -mnohc-struct-return

MIPS選項
-mcpu=cpu type -mips2 -mips3 -mint64 -mlong64 -mmips-as -mgas -mrnames -mno-rnames -mgpopt -mno-gpopt -mstats -mno-stats -mmemcpy -mno-memcpy -mno-mips-tfile -mmips-tfile -msoft-float -mhard-float -mabicalls -mno-abicalls -mhalf-pic -mno-half-pic -G num -nocpp

i386選項
-m486 -mno-486 -msoft-float -mno-fp-ret-in-387

HPPA選項
-mpa-risc-1-0 -mpa-risc-1-1 -mkernel -mshared-libs -mno-shared-libs -mlong-calls -mdisable-fpregs -mdisable-indexing -mtrailing-colon

i960選項
-mcpu-type -mnumerics -msoft-float -mleaf-procedures -mno-leaf-procedures -mtail-call -mno-tail-call -mcomplex-addr -mno-complex-addr -mcode-align -mno-code-align -mic-compat -mic2.0-compat -mic3.0-compat -masm-compat -mintel-asm -mstrict-align -mno-strict-align -mold-align -mno-old-align

DEC Alpha選項
-mfp-regs -mno-fp-regs -mno-soft-float -msoft-float

System V選項
-G -Qy -Qn -YP,paths -Ym,dir

代碼生成選項(Code Generation Option)

-fcall-saved-reg -fcall-used-reg -ffixed-reg -finhibit-size-directive -fnonnull-objects -fno-common -fno-ident -fno-gnu-linker -fpcc-struct-return -fpic -fPIC -freg-struct-return -fshared-data -fshort-enums -fshort-double -fvolatile -fvolatile-global -fverbose-asm

整體選項(Overall Option)

-x language

明確指出後面輸入文件的語言爲language (而不是從文件名後綴獲得的默認選擇).這個選項應用於後面 全部的輸入文件,直到遇着下一個`-x'選項. language的可選值有`c', `objective-c', `c-header', `c++', `cpp-output', `assembler',和`assembler-with-cpp'.

-x none

關閉任何對語種的明確說明,所以依據文件名後綴處理後面的文件(就象是從未使用過`-x'選項).

若是隻操做四個階段(預處理,編譯,彙編,鏈接)中的一部分,可使用`-x'選項(或文件名後綴)告訴 gcc從哪裏開始,用`-c', `-S',或`-E'選項告訴gcc到 哪裏結束.注意,某些選項組合(例如, `-x cpp-output -E')使gcc不做任何事情.

-c

編譯或彙編源文件,可是不做鏈接.編譯器輸出對應於源文件的目標文件.

缺省狀況下, GCC經過用`.o'替換源文件名後綴`.c', `.i', `.s',等等,產生目標文件名.可使用-o選項選擇其餘名字.

GCC忽略-c選項後面任何沒法識別的輸入文件(他們不須要編譯或彙編).

-S

編譯後即中止,不進行彙編.對於每一個輸入的非彙編語言文件,輸出文件是彙編語言文件.

缺省狀況下, GCC經過用`.o'替換源文件名後綴`.c', `.i',等等,產生 目標文件名.可使用-o選項選擇其餘名字.

GCC忽略任何不須要編譯的輸入文件.

-E

預處理後即中止,不進行編譯.預處理後的代碼送往標準輸出.

GCC忽略任何不須要預處理的輸入文件.

-o file

指定輸出文件爲file.該選項不在意GCC產生什麼輸出,不管是可執行文件,目標文件,彙編文件仍是 預處理後的C代碼.

因爲只能指定一個輸出文件,所以編譯多個輸入文件時,使用`-o'選項沒有意義,除非輸出一個可執行文件.

若是沒有使用`-o'選項,默認的輸出結果是:可執行文件爲`a.out', `source.suffix '的目標文件是`source.o',彙編文件是 `source.s',而預處理後的C源代碼送往標準輸出.

-v

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

-pipe

在編譯過程的不一樣階段間使用管道而非臨時文件進行通訊.這個選項在某些系統上沒法工做,由於那些系統的 彙編器不能從管道讀取數據. GNU的彙編器沒有這個問題.

語言選項(LANGUAGE OPTIONS)

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

-ansi

支持符合ANSI標準的C程序.

這樣就會關閉GNU C中某些不兼容ANSI C的特性,例如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'選項也有相同效果.

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

GCC 2

Section: GNU Tools (1)
Updated: 2003/12/05
Supporter: Blackjack and more Blackjack Games built by Mike Costello

預處理器選項(Preprocessor Option)

下列選項針對C預處理器,預處理器用在正式編譯之前,對C 源文件進行某種處理.

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

-include file

在處理常規輸入文件以前,首先處理文件file,其結果是,文件file的內容先獲得編譯. 命令行上任何`-D'和`-U'選項永遠在`-include file'以前處理, 不管他們在命令行上的順序如何.然而`-include'和`-imacros'選項按書寫順序處理.

-imacros file

在處理常規輸入文件以前,首先處理文件file,可是忽略輸出結果.因爲丟棄了文件file的 輸出內容, `-imacros file'選項的惟一效果就是使文件file中的宏定義生效, 能夠用於其餘輸入文件.在處理`-imacrosfile'選項以前,預處理器首先處理`-D' 和`-U'選項,並不在意他們在命令行上的順序.然而`-include'和 `-imacros'選項按書寫順序處理.

-idirafter dir

把目錄dir添加到第二包含路徑中.若是某個頭文件在主包含路徑(用`-I'添加的路徑)中沒有 找到,預處理器就搜索第二包含路徑.

-iprefix prefix

指定prefix做爲後續`-iwithprefix'選項的前綴.

-iwithprefix dir

把目錄添加到第二包含路徑中.目錄名由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的庫文件.

鏈接器在標準搜索目錄中尋找這個庫文件,庫文件的真正名字是`liblibrary.a'.鏈接器會 當作文件名獲得準確說明同樣引用這個文件.

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

通常說來用這個方法找到的文件是庫文件---即由目標文件組成的歸檔文件(archive file).鏈接器處理歸檔文件的 方法是:掃描歸檔文件,尋找某些成員,這些成員的符號目前已被引用,不過尚未被定義.可是,若是鏈接器找到普通的 目標文件,而不是庫文件,就把這個目標文件按日常方式鏈接進來.指定`-l'選項和指定文件名的惟一區別是, `-l選項用`lib'和`.a'把library包裹起來,並且搜索一些目錄.

-lobjc

這個-l選項的特殊形式用於鏈接Objective C程序.

-nostartfiles

不鏈接系統標準啓動文件,而標準庫文件仍然正常使用.

-nostdlib

不鏈接系統標準啓動文件和標準庫文件.只把指定的文件傳遞給鏈接器.

-static

在支持動態鏈接(dynamic linking)的系統上,阻止鏈接共享庫.該選項在其餘系統上無效.

-shared

生成一個共享目標文件,他能夠和其餘目標文件鏈接產生可執行文件.只有部分系統支持該選項.

-symbolic

創建共享目標文件的時候,把引用綁定到全局符號上.對全部沒法解析的引用做出警告(除非用鏈接編輯選項 `-Xlinker -z -Xlinker defs'取代).只有部分系統支持該選項.

-Xlinker option

把選項option傳遞給鏈接器.能夠用他傳遞系統特定的鏈接選項, GNU CC沒法識別這些選項.

若是須要傳遞攜帶參數的選項,你必須使用兩次`-Xlinker',一次傳遞選項,另外一次傳遞他的參數. 例如,若是傳遞`-assert definitions',你必須寫成`-Xlinker -assert -Xlinker definitions',而不能寫成`-Xlinker "-assert definitions"',由於這樣會把整個 字符串當作一個參數傳遞,顯然這不是鏈接器期待的.

-Wl,option

把選項option傳遞給鏈接器.若是option中含有逗號,就在逗號處分割成多個選項.

-u symbol

使鏈接器認爲取消了symbol的符號定義,從而鏈接庫模塊以取得定義.你可使用多個 `-u'選項,各自跟上不一樣的符號,使得鏈接器調入附加的庫模塊.

目錄選項(DIRECTORY OPTION)

下列選項指定搜索路徑,用於查找頭文件,庫文件,或編譯器的某些成員:

-Idir

在頭文件的搜索路徑列表中添加dir 目錄.

-I-

任何在`-I-'前面用`-I'選項指定的搜索路徑只適用於`#include "file"'這種狀況;他們不能用來搜索`#include <file>'包含的頭文件.

若是用`-I'選項指定的搜索路徑位於`-I-'選項後面,就能夠在這些路徑中搜索全部的 `#include'指令. (通常說來-I選項就是這麼用的.)

還有, `-I-'選項可以阻止當前目錄(存放當前輸入文件的地方)成爲搜索`#include "file"'的第一選擇.沒有辦法克服`-I-'選項的這個效應.你能夠指定 `-I.'搜索那個目錄,它在調用編譯器時是當前目錄.這和預處理器的默認行爲不徹底同樣,可是結果一般 使人滿意.

`-I-'不影響使用系統標準目錄,所以, `-I-'和`-nostdinc'是不一樣的選項.

-Ldir

在`-l'選項的搜索路徑列表中添加dir目錄.

-Bprefix

這個選項指出在何處尋找可執行文件,庫文件,以及編譯器本身的數據文件.

編譯器驅動程序須要執行某些下面的子程序: `cpp', `cc1' (或C++的 `cc1plus'), `as'和`ld'.他把prefix看成欲執行的程序的 前綴,既能夠包括也能夠不包括`machine/version/'.

對於要運行的子程序,編譯器驅動程序首先試着加上`-B'前綴(若是存在).若是沒有找到文件,或沒有指定 `-B'選項,編譯器接着會試驗兩個標準前綴`/usr/lib/gcc/'和 `/usr/local/lib/gcc-lib/'.若是仍然沒可以找到所需文件,編譯器就在`PATH'環境變量 指定的路徑中尋找沒加任何前綴的文件名.

若是有須要,運行時(run-time)支持文件`libgcc.a'也在`-B'前綴的搜索範圍以內. 若是這裏沒有找到,就在上面提到的兩個標準前綴中尋找,僅此而已.若是上述方法沒有找到這個文件,就不鏈接他了.多數 狀況的多數機器上, `libgcc.a'並不是必不可少.

你能夠經過環境變量GCC_EXEC_PREFIX得到近似的效果;若是定義了這個變量,其值就和上面說的 同樣用作前綴.若是同時指定了`-B'選項和GCC_EXEC_PREFIX變量,編譯器首先使用 `-B'選項,而後才嘗試環境變量值.

警告選項(WARNING OPTION)

警告是針對程序結構的診斷信息,程序不必定有錯誤,而是存在風險,或者可能存在 錯誤.

下列選項控制GNU CC產生的警告的數量和類型:

-fsyntax-only

檢查程序中的語法錯誤,可是不產生輸出信息.

-w

禁止全部警告信息.

-Wno-import

禁止全部關於#import的警告信息.

-pedantic

打開徹底服從ANSI C標準所需的所有警告診斷;拒絕接受採用了被禁止的語法擴展的程序.

不管有沒有這個選項,符合ANSI C標準的程序應該可以被正確編譯(雖然極少數程序須要`-ansi' 選項).然而,若是沒有這個選項,某些GNU擴展和傳統C特性也獲得支持.使用這個選項能夠拒絕這些程序.沒有理由 使用這個選項,他存在只是爲了知足一些書呆子(pedant).

對於替選關鍵字(他們以`__'開始和結束) `-pedantic'不會產生警告信息. Pedantic 也不警告跟在__extension__後面的表達式.不過只應該在系統頭文件中使用這種轉義措施,應用程序最好 避免.

-pedantic-errors

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

-W

對下列事件顯示額外的警告信息:

*

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

編譯器只知道對setjmp的調用,他不可能知道會在哪裏調用longjmp,事實上一個 信號處理例程能夠在程序的任何地點調用他.其結果是,即便程序沒有問題,你也可能會獲得警告,由於沒法在可能出現問題 的地方調用longjmp.

*

既能夠返回值,也能夠不返回值的函數. (缺乏結尾的函數體被看做不返回函數值)例如,下面的函數將致使這種警告:

foo (a)

{

if (a > 0)

return a;

}

因爲GNU CC不知道某些函數永不返回(含有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

視警告爲錯誤;出現任何警告即放棄編譯.

GCC 3

Section: GNU Tools (1)
Updated: 2003/12/05

調試選項(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

相關文章
相關標籤/搜索