培訓(xùn)課件及-7課本7上p96開始_第1頁
培訓(xùn)課件及-7課本7上p96開始_第2頁
培訓(xùn)課件及-7課本7上p96開始_第3頁
培訓(xùn)課件及-7課本7上p96開始_第4頁
培訓(xùn)課件及-7課本7上p96開始_第5頁
已閱讀5頁,還剩99頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

gcc,g++

-GNU工程的C和C++編譯器FrancHE總述C和C++編譯器是集成的.他們都要用四個(gè)步驟中的一個(gè)或多個(gè)處理輸入文件:預(yù)處理(preprocessing),編譯(compilation),匯編(assembly)和連接(linking).源文件后綴名標(biāo)識(shí)源文件的語言,但是對(duì)編譯器來說,后綴名控制著缺省設(shè)定:gcc認(rèn)為預(yù)處理后的文件(.i)是C文件,并且設(shè)定C形式的連接.g++認(rèn)為預(yù)處理后的文件(.i)是C++文件,并且設(shè)定C++形式的連接.源文件后綴名指出語言種類以及后期的操作:.cC源程序;預(yù)處理,編譯,匯編.CC++源程序;預(yù)處理,編譯,匯編.ccC++源程序;預(yù)處理,編譯,匯編.cxxC++源程序;預(yù)處理,編譯,匯編.mObjective-C源程序;預(yù)處理,編譯,匯編.i預(yù)處理后的C文件;編譯,匯編.ii預(yù)處理后的C++文件;編譯,匯編.s匯編語言源程序;匯編.S匯編語言源程序;預(yù)處理,匯編.h預(yù)處理器文件;通常不出現(xiàn)在命令行上

其他后綴名的文件被傳遞給連接器(linker).通常包括:

.o目標(biāo)文件(Objectfile).a歸檔庫文件(Archivefile)示例程序(hello.c)1/*2*Listing7.13*hello.c–Canonical“Hello,world!”*/5#include<stdio.h>67intmain(void)8{9fprintf(stdout,“Hello,Linuxprogrammingworld!\n”);10return0;11}選項(xiàng)(OPTIONS)選項(xiàng)必須分立給出:`-dr'完全不同于`-d-r'.大多數(shù)`-f'和`-W'選項(xiàng)有兩個(gè)相反的格式:-fname和-fno-name(或-Wname和-Wno-name).這里只列舉不是默認(rèn)選項(xiàng)的格式.下面是所有選項(xiàng)的摘要,按類型分組,解釋放在后面的章節(jié)中.

總體選項(xiàng)(OverallOption)-c-S-E-ofile-pipe-v-xlanguage語言選項(xiàng)(LanguageOption)-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警告選項(xiàng)(WarningOption)-fsyntax-only-pedantic-pedantic-errors-w-W-Wall-Waggregate-return-Wcast-align-Wcast-qual-Wchar-subscriptment-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調(diào)試選項(xiàng)(DebuggingOption)-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優(yōu)化選項(xiàng)(OptimizationOption)-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預(yù)處理器選項(xiàng)(PreprocessorOption)-Aassertion-C-dD-dM-dN-Dmacro[=defn]-E-H-idirafterdir-includefile-imacrosfile-iprefixfile-iwithprefixdir-M-MD-MM-MMD-nostdinc-P-Umacro-undef匯編器選項(xiàng)(AssemblerOption)-Wa,option連接器選項(xiàng)(LinkerOption)-llibrary-nostartfiles-nostdlib-static-shared-symbolic-Xlinkeroption-Wl,option-usymbol目錄選項(xiàng)(DirectoryOption)-Bprefix-Idir-I--Ldir目標(biāo)機(jī)選項(xiàng)(TargetOption)-bmachine-Vversion

配置相關(guān)選項(xiàng)(ConfigurationDependentOption)M680x0選項(xiàng)-m68000-m68020-m68020-40-m68030-m68040-m68881-mbitfield-mc68000-mc68020-mfpa-mnobitfield-mrtd-mshort-msoft-floatVAX選項(xiàng)-mg-mgnu-munix

SPARC選項(xiàng)-mepilogue-mfpu-mhard-float-mno-fpu-mno-epilogue-msoft-float-msparclite-mv8-msupersparc-mcypress

Convex選項(xiàng)-margcount-mc1-mc2-mnoargcount

AMD29K選項(xiàng)-m29000-m29050-mbw-mdw-mkernel-registers-mlarge-mnbw-mnodw-msmall-mstack-check-muser-registers

M88K選項(xiàng)-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選項(xiàng)-mfp-in-toc-mno-fop-in-toc

RT選項(xiàng)-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選項(xiàng)-mcpu=cputype-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-Gnum-nocpp

i386選項(xiàng)-m486-mno-486-msoft-float-mno-fp-ret-in-387

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

i960選項(xiàng)-mcpu-type-mnumerics-msoft-float-mleaf-procedures-mno-leaf-procedures-mtail-call-mno-tail-callplex-addrplex-addr-mcode-align-mno-code-alignpatpatpatpat-mintel-asm-mstrict-align-mno-strict-align-mold-align-mno-old-align

DECAlpha選項(xiàng)-mfp-regs-mno-fp-regs-mno-soft-float-msoft-floatSystemV選項(xiàng)-G-Qy-Qn-YP,paths-Ym,dir

代碼生成選項(xiàng)(CodeGenerationOption)-fcall-saved-reg-fcall-used-reg-ffixed-reg-finhibit-size-directive-fnonnull-objectsmon-fno-ident-fno-gnu-linker-fpcc-struct-return-fpic-fPIC-freg-struct-return-fshared-data-fshort-enums-fshort-double-fvolatile-fvolatile-global-fverbose-asm總體選項(xiàng)(OverallOption)-xlanguage明確指出后面輸入文件的語言為language(而不是從文件名后綴得到的默認(rèn)選擇).這個(gè)選項(xiàng)應(yīng)用于后面所有的輸入文件,直到遇著下一個(gè)`-x'選項(xiàng).language的可選值有`c',`objective-c',`c-header',`c++',`cpp-output',`assembler',和`assembler-with-cpp'.-xnone關(guān)閉任何對(duì)語種的明確說明,因此依據(jù)文件名后綴處理后面的文件(就象是從未使用過`-x'選項(xiàng)).如果只操作四個(gè)階段(預(yù)處理,編譯,匯編,連接)中的一部分,可以使用`-x'選項(xiàng)(或文件名后綴)告訴gcc從哪里開始,用`-c',`-S',或`-E'選項(xiàng)告訴gcc到哪里結(jié)束.注意,某些選項(xiàng)組合(例如,`-xcpp-output-E')使gcc不作任何事情.-c編譯或匯編源文件,但是不作連接.編譯器輸出對(duì)應(yīng)于源文件的目標(biāo)文件.缺省情況下,GCC通過用`.o'替換源文件名后綴`.c',`.i',`.s',等等,產(chǎn)生目標(biāo)文件名.可以使用-o選項(xiàng)選擇其他名字.

GCC忽略-c選項(xiàng)后面任何無法識(shí)別的輸入文件(他們不需要編譯或匯編). 演示:gcc-chello.c-S編譯后即停止,不進(jìn)行匯編.對(duì)于每個(gè)輸入的非匯編語言文件,輸出文件是匯編語言文件.缺省情況下,GCC通過用`.o'替換源文件名后綴`.c',`.i',等等,產(chǎn)生目標(biāo)文件名.可以使用-o選項(xiàng)選擇其他名字.GCC忽略任何不需要編譯的輸入文件.演示:gcc-Shello.c-E預(yù)處理后即停止,不進(jìn)行編譯.預(yù)處理后的代碼送往標(biāo)準(zhǔn)輸出.GCC忽略任何不需要預(yù)處理的輸入文件.注意:1如果不加說明,將會(huì)把結(jié)果直接打印在屏幕(或標(biāo)準(zhǔn)輸出)上 2可以使用重定向解決上述問題:

gcc-Ehello.c>hello.e 3也可以使用重命名:

gcc–Ehello.c–ohello.p可以看到,預(yù)編譯對(duì)程序所調(diào)用的庫和頭文件(宏定義)都可以看得很清楚,對(duì)開發(fā)有比較大的幫助。-ofile指定輸出文件為file.該選項(xiàng)不在乎GCC產(chǎn)生什么輸出,無論是可執(zhí)行文件,目標(biāo)文件,匯編文件還是預(yù)處理后的C代碼.由于只能指定一個(gè)輸出文件,因此編譯多個(gè)輸入文件時(shí),使用`-o'選項(xiàng)沒有意義,除非輸出一個(gè)可執(zhí)行文件.

如果沒有使用`-o'選項(xiàng),默認(rèn)的輸出結(jié)果是:可執(zhí)行文件為`a.out',`source.suffix'的目標(biāo)文件是`source.o',匯編文件是`source.s',而預(yù)處理后的C源代碼送往標(biāo)準(zhǔn)輸出.-v(在標(biāo)準(zhǔn)錯(cuò)誤)顯示執(zhí)行編譯階段的命令.同時(shí)顯示編譯器驅(qū)動(dòng)程序,預(yù)處理器,編譯器的版本號(hào). 演示:gcc-vhello.c-ohello.o大家可以看到: 1)gcc真正使用的是/usr/lib/gcc-lib/i386-redhat-linux/3.2.3/cc1這個(gè)編譯程序(這個(gè)才是真正的c語言編譯程序)(C++使用的是collect2程序) 2)-lang-c-v-D__GNUC__=3-D__GNUC_MINOR__=2-D__GNUC_PATCHLEVEL__=3-D__GXX_ABI_VERSION=102-D__ELF__-Dunix-D__gnu_linux__-Dlinux-D__ELF__-D__unix__-D__gnu_linux__-D__linux__-D__unix-D__linux-Asystem=posix-D__NO_INLINE__-D__STDC_HOSTED__=1-Acpu=i386-Amachine=i386-Di386-D__i386-D__i386__-D__tune_i386__hello.c-quiet–dumpbase這些全部都是編譯的選項(xiàng)。

語言選項(xiàng)(LANGUAGEOPTIONS)

下列選項(xiàng)控制編譯器能夠接受的C"方言":-ansi支持符合ANSI標(biāo)準(zhǔn)的C程序.這樣就會(huì)關(guān)閉GNUC中某些不兼容ANSIC的特性,例如asm,inline和typeof關(guān)鍵字,以及諸如unix和vax這些表明當(dāng)前系統(tǒng)類型的預(yù)定義宏.同時(shí)開啟不受歡迎和極少使用的ANSItrigraph特性,以及禁止`$'成為標(biāo)識(shí)符的一部分.盡管使用了`-ansi‘選項(xiàng),下面這些可選的關(guān)鍵字,__asm__,__extension__,__inline__和__typeof__仍然有效.你當(dāng)然不會(huì)把他們用在ANSIC程序中,但可以把他們放在頭文件里,因?yàn)榫幾g包含這些頭文件的程序時(shí),可能會(huì)指定`-ansi’選項(xiàng).另外一些預(yù)定義宏,如__unix__和__vax__,無論有沒有使用`-ansi‘選項(xiàng),始終有效.使用`-ansi'選項(xiàng)不會(huì)自動(dòng)拒絕編譯非ANSI程序,除非增加`-pedantic'選項(xiàng)作為`-ansi'選項(xiàng)的補(bǔ)充.注意:?jiǎn)卧~pedantic是書呆子氣的意思使用`-ansi‘選項(xiàng)的時(shí)候,預(yù)處理器會(huì)預(yù)定義一個(gè)__STRICT_ANSI__宏.有些頭文件關(guān)注此宏,以避免聲明某些函數(shù),或者避免定義某些宏,這些函數(shù)和宏不被ANSI標(biāo)準(zhǔn)調(diào)用;這樣就不會(huì)干擾在其他地方使用這些名字的程序了.(意思就是在看別人的程序的時(shí)候,注意這個(gè)宏是被顯式的用到了)-fno-asm不把a(bǔ)sm,inline或typeof當(dāng)作關(guān)鍵字,因此這些詞可以用做標(biāo)識(shí)符.用__asm__,__inline__和__typeof__能夠替代他們.`-ansi'隱含聲明了`-fno-asm'.-fno-builtin不接受不是兩個(gè)下劃線開頭的內(nèi)建函數(shù)(built-infunction).目前受影響的函數(shù)有_exit,abort,abs,alloca,cos,exit,fabs,labs,memcmp,memcpy,sin,sqrt,strcmp,strcpy,和strlen.`-ansi'選項(xiàng)能夠阻止alloca和_exit成為內(nèi)建函數(shù).-fhosted按宿主環(huán)境編譯;他隱含聲明了`-fbuiltin'選項(xiàng),而且警告不正確的main函數(shù)聲明.-ffreestanding按獨(dú)立環(huán)境編譯;他隱含聲明了`-fno-builtin'選項(xiàng),而且對(duì)main函數(shù)沒有特別要求.(注:宿主環(huán)境(hostedenvironment)下所有的標(biāo)準(zhǔn)庫可用,main函數(shù)返回一個(gè)int值,典型例子是除了內(nèi)核以外幾乎所有的程序.對(duì)應(yīng)的獨(dú)立環(huán)境(freestandingenvironment)不存在標(biāo)準(zhǔn)庫,程序入口也不一定是

main,最明顯的例子就是操作系統(tǒng)內(nèi)核.

-fno-strict-prototype對(duì)于沒有參數(shù)的函數(shù)聲明,例如`intfoo();',按C風(fēng)格處理---即不說明參數(shù)個(gè)數(shù)或類型.(僅針對(duì)C++).正常情況下,這樣的函數(shù)foo在C++中意味著參數(shù)為空.

-trigraphs支持ANSICtrigraphs.`-ansi‘選項(xiàng)隱含聲明了`-trigraphs’.(三字符序列:比如:??=)-traditional試圖支持傳統(tǒng)C編譯器的某些方面.詳見GNUC手冊(cè),對(duì)于C++程序(不是C),`-traditional'選項(xiàng)帶來一個(gè)附加效應(yīng),允許對(duì)this賦值.他和`-fthis-is-variable'選項(xiàng)的效果一樣.

-traditional-cpp試圖支持傳統(tǒng)C預(yù)處理器的某些方面.特別是上面提到有關(guān)預(yù)處理器的內(nèi)容,但是不包括`-traditional'選項(xiàng)的其他效應(yīng).

-fdollars-in-identifiers允許在標(biāo)識(shí)符(identifier)中使用`$'字符(僅針對(duì)C++).你可以指定`-fno-dollars-in-identifiers'選項(xiàng)顯明禁止使用`$'符.(GNUC++在某些目標(biāo)系統(tǒng)缺省允許`$'符,但不是所有系統(tǒng).)-fenum-int-equiv允許int類型到枚舉類型(enumeration)的隱式轉(zhuǎn)換(僅限于C++).正常情況下GNUC++允許從enum到int的轉(zhuǎn)換,反之則不行.-fthis-is-variable允許對(duì)this賦值(僅對(duì)C++).合并用戶自定義的自由存儲(chǔ)管理機(jī)制到C++后,使可賦值的`this'顯得不合時(shí)宜.因此,默認(rèn)情況下,類成員函數(shù)內(nèi)部對(duì)this賦值是無效操作.然而為了向后兼容,你可以通過`-fthis-is-variable'選項(xiàng)使這種操作有效.-funsigned-char把char定義為無符號(hào)類型,如同unsignedchar.各種機(jī)器都有自己缺省的char類型.既可能是unsignedchar也可能是signedchar.

理想情況下,當(dāng)依賴于數(shù)據(jù)的符號(hào)性時(shí),一個(gè)可移植程序總是應(yīng)該使用signedchar或unsignedchar.但是許多程序已經(jīng)寫成只用簡(jiǎn)單的char,并且期待這是有符號(hào)數(shù)(或者無符號(hào)數(shù),具體情況取決于編寫程序的目標(biāo)機(jī)器).這個(gè)選項(xiàng),和它的反義選項(xiàng),使那樣的程序工作在對(duì)應(yīng)的默認(rèn)值上.char的類型始終應(yīng)該明確定義為signedchar或unsignedchar,即使它表現(xiàn)的和其中之一完全一樣.-fsigned-char把char定義為有符號(hào)類型,如同signedchar.這個(gè)選項(xiàng)等同于`-fno-unsigned-char',他是thenegativeformof`-funsigned-char'的相反選項(xiàng).同樣,`-fno-signed-char'等價(jià)于`-funsigned-char'.

-fcond-mismatch允許條件表達(dá)式的第二和第三個(gè)參數(shù)的類型不匹配.這種表達(dá)式的值是void.問題:因?yàn)閙map函數(shù)返回值是void*類型,是否可以將其強(qiáng)制轉(zhuǎn)換成char*類型,按字符串操作,然后將修改重新寫入內(nèi)存映像即可?-fsigned-bitfields-funsigned-bitfields-fno-signed-bitfields-fno-unsigned-bitfields如果沒有明確聲明`signed'或`unsigned'修飾符,這些選項(xiàng)用來定義有符號(hào)位域(bitfield)或無符號(hào)位域.缺省情況下,位域是有符號(hào)的,因?yàn)樗麄兝^承的基本整數(shù)類型,如int,是有符號(hào)數(shù).然而,如果指定了`-traditional'選項(xiàng),位域永遠(yuǎn)是無符號(hào)數(shù).-fwritable-strings把字符串常量存儲(chǔ)到可寫數(shù)據(jù)段,而且不做特別對(duì)待.這是為了兼容一些老程序,他們假設(shè)字符串常量是可寫的.`-traditional'選項(xiàng)也有相同效果.篡改字符串常量是一個(gè)非常糟糕的想法;``常量''就應(yīng)該是常量.

預(yù)處理器選項(xiàng)(PreprocessorOption)

下列選項(xiàng)針對(duì)C預(yù)處理器,預(yù)處理器用在正式編譯以前,對(duì)C源文件進(jìn)行某種處理.如果指定了`-E'選項(xiàng),GCC只進(jìn)行預(yù)處理工作.下面的某些選項(xiàng)必須和`-E'選項(xiàng)一起才有意義,因?yàn)樗麄兊妮敵鼋Y(jié)果不能用于編譯.-includefile在處理常規(guī)輸入文件之前,首先處理文件file,其結(jié)果是,文件file的內(nèi)容先得到編譯.命令行上任何`-D‘和`-U’選項(xiàng)(后面會(huì)將它們的含義)永遠(yuǎn)在`-includefile'之前處理,無論他們?cè)诿钚猩系捻樞蛉绾?然而`-include'和`-imacros'選項(xiàng)按書寫順序處理.-imacrosfile在處理常規(guī)輸入文件之前,首先處理文件file,但是忽略輸出結(jié)果.由于丟棄了文件file的

輸出內(nèi)容,`-imacrosfile'選項(xiàng)的唯一效果就是使文件file中的宏定義生效,可以用于其他輸入文件.在處理`-imacrosfile'選項(xiàng)之前,預(yù)處理器首先處理`-D'和`-U'選項(xiàng),并不在乎他們?cè)诿钚猩系捻樞?然而`-include'和`-imacros'選項(xiàng)按書寫順序處理.-idirafterdir把目錄dir添加到第二包含路徑中.如果某個(gè)頭文件在主包含路徑(用`-I'添加的路徑)中沒有找到,預(yù)處理器就搜索第二包含路徑.

-iprefixprefix指定prefix作為后續(xù)`-iwithprefix'選項(xiàng)的前綴.

-iwithprefixdir把目錄添加到第二包含路徑中.目錄名由prefix和dir合并而成,這里prefix被先前的`-iprefix'選項(xiàng)指定.-nostdinc不要在標(biāo)準(zhǔn)系統(tǒng)目錄中尋找頭文件.只搜索`-I'選項(xiàng)指定的目錄(以及當(dāng)前目錄,如果合適).結(jié)合使用`-nostdinc'和`-I-'選項(xiàng),你可以把包含文件搜索限制在顯式指定的目錄.

-nostdinc++不要在C++專用標(biāo)準(zhǔn)目錄中尋找頭文件,但是仍然搜索其他標(biāo)準(zhǔn)目錄.(當(dāng)建立`libg++'時(shí)使用這個(gè)選項(xiàng).)-undef不要預(yù)定義任何非標(biāo)準(zhǔn)宏.(包括系統(tǒng)結(jié)構(gòu)標(biāo)志).(標(biāo)準(zhǔn)宏指的是系統(tǒng)預(yù)定義的有含義的宏,比如__i386)-E僅運(yùn)行C預(yù)處理器.預(yù)處理所有指定的C源文件,結(jié)果送往標(biāo)準(zhǔn)輸出或指定的輸出文件.

-C告訴預(yù)處理器不要丟棄注釋.配合`-E'選項(xiàng)使用.

-P告訴預(yù)處理器不要產(chǎn)生`#line'命令.配合`-E'選項(xiàng)使用.-M[-MG]告訴預(yù)處理器輸出一個(gè)適合make的規(guī)則,用于描述各目標(biāo)文件的依賴關(guān)系.對(duì)于每個(gè)源文件,預(yù)處理器輸出一個(gè)make規(guī)則,該規(guī)則的目標(biāo)項(xiàng)(target)是源文件對(duì)應(yīng)的目標(biāo)文件名,依賴項(xiàng)(dependency)是源文件中`#include引用的所有文件.生成的規(guī)則可以是單行,但如果太長(zhǎng),就用`\'-換行符續(xù)成多行.規(guī)則顯示在標(biāo)準(zhǔn)輸出,不產(chǎn)生預(yù)處理過的C程序.`-M'隱含了`-E'選項(xiàng).

`-MG'要求把缺失的頭文件按存在對(duì)待,并且假定他們和源程序文件在同一目錄下.必須和`-M'選項(xiàng)一起用.-MM[-MG]和`-M'選項(xiàng)類似,但是輸出結(jié)果僅涉及用戶頭文件,象這樣`#includefile"'.忽略系統(tǒng)頭文件如`#include<file>'.

-MD和`-M'選項(xiàng)類似,但是把依賴信息輸出在文件中,文件名通過把輸出文件名末尾的`.o'替換為`.d'產(chǎn)生.同時(shí)繼續(xù)指定的編譯工作---`-MD'不象`-M'那樣阻止正常的編譯任務(wù).Make的實(shí)用工具`md'能夠合并`.d'文件,產(chǎn)生適用于`make'命令的單一的依賴文件.

-MMD和`-MD‘選項(xiàng)類似,但是輸出結(jié)果僅涉及用戶頭文件,忽略系統(tǒng)頭文件.注意:這是自動(dòng)生成依賴文件的方法演示:gcc-M-MDhello.c-H除了其他普通的操作,GCC顯示引用過的頭文件名.演示:gcc-Hhello.c-Aquestion(answer)如果預(yù)處理器做條件測(cè)試,如`#if#question(answer)‘,該選項(xiàng)可以斷言(Assert)question的答案是answer.-A-’關(guān)閉一般用于描述目標(biāo)機(jī)的標(biāo)準(zhǔn)斷言.(注意:這里是對(duì)宏進(jìn)行斷言,和assert是不一樣的,這個(gè)選項(xiàng)極其有用)-Dmacro定義宏macro,宏的內(nèi)容定義為字符串`1'.

-Dmacro=defn定義宏macro的內(nèi)容為defn.命令行上所有的`-D'選項(xiàng)在`-U'選項(xiàng)之前處理.

-Umacro取消宏macro.`-U'選項(xiàng)在所有的`-D'選項(xiàng)之后處理,但是優(yōu)先于任何`-include'或`-imacros'選項(xiàng).-dM告訴預(yù)處理器輸出有效的宏定義列表(預(yù)處理結(jié)束時(shí)仍然有效的宏定義).該選項(xiàng)需結(jié)合`-E'選項(xiàng)使用.

演示:gcc-E-dMhello.c|grep-w'HELLO'-dD告訴預(yù)處理器把所有的宏定義傳遞到輸出端,按照出現(xiàn)的順序顯示.

-dN和`-dD'選項(xiàng)類似,但是忽略宏的參量或內(nèi)容.只在輸出端顯示`#definename.

匯編器選項(xiàng)(ASSEMBLEROPTION)

-Wa,option把選項(xiàng)option傳遞給匯編器.如果option含有逗號(hào),就在逗號(hào)處分割成多個(gè)選項(xiàng).注意:看到這個(gè)選項(xiàng)就可以知道,它要編譯的一定是一個(gè)匯編程序

連接器選項(xiàng)(LINKEROPTION)

下面的選項(xiàng)用于編譯器連接目標(biāo)文件,輸出可執(zhí)行文件的時(shí)候,如果編譯器不進(jìn)行連接,他們就毫無意義.object-file-name如果某些文件沒有特別明確的后綴aspecialrecognizedsuffix,GCC就認(rèn)為他們是目標(biāo)文件或庫文件.(根據(jù)文件內(nèi)容,連接器能夠區(qū)分目標(biāo)文件和庫文件).如果GCC執(zhí)行連接操作,這些目標(biāo)文件將成為連接器的輸入文件.-llibrary連接名為library的庫文件.連接器在標(biāo)準(zhǔn)搜索目錄中尋找這個(gè)庫文件,庫文件的真正名字是`liblibrary.a'.連接器會(huì)當(dāng)做文件名得到準(zhǔn)確說明一樣引用這個(gè)文件.

搜索目錄除了一些系統(tǒng)標(biāo)準(zhǔn)目錄外,還包括用戶以`-L'選項(xiàng)指定的路徑.

一般說來用這個(gè)方法找到的文件是庫文件---即由目標(biāo)文件組成的歸檔文件(archivefile).連接器處理歸檔文件的方法是:掃描歸檔文件,尋找某些成員,這些成員的符號(hào)目前已被引用,不過還沒有被定義.但是,如果連接器找到普通的目標(biāo)文件,而不是庫文件,就把這個(gè)目標(biāo)文件按平常方式連接進(jìn)來.指定`-l‘選項(xiàng)和指定文件名(上一頁)的唯一區(qū)別是,`-l選項(xiàng)用`lib'和`.a'把library包裹起來,而且搜索一些目錄.-lobjc這個(gè)-l選項(xiàng)的特殊形式用于連接ObjectiveC程序.

-nostartfiles不連接系統(tǒng)標(biāo)準(zhǔn)啟動(dòng)文件,而標(biāo)準(zhǔn)庫文件仍然正常使用.

(目前不清楚,可能是lib_std_startmain等等的庫函數(shù),用于引導(dǎo)main函數(shù))-nostdlib不連接系統(tǒng)標(biāo)準(zhǔn)啟動(dòng)文件和標(biāo)準(zhǔn)庫文件.只把指定的文件傳遞給連接器.

-static在支持動(dòng)態(tài)連接(dynamiclinking)的系統(tǒng)上,阻止連接共享庫.該選項(xiàng)在其他系統(tǒng)上無效.

-shared生成一個(gè)共享目標(biāo)文件,他可以和其他目標(biāo)文件連接產(chǎn)生可執(zhí)行文件.只有部分系統(tǒng)支持該選項(xiàng).-symbolic建立共享目標(biāo)文件的時(shí)候,把引用綁定到全局符號(hào)上.對(duì)所有無法解析的引用作出警告(除非用連接編輯選項(xiàng)`-Xlinker-z-Xlinkerdefs'取代).只有部分系統(tǒng)支持該選項(xiàng).

-Xlinkeroption把選項(xiàng)option傳遞給連接器.可以用他傳遞系統(tǒng)特定的連接選項(xiàng),GNUCC無法識(shí)別這些選項(xiàng).如果需要傳遞攜帶參數(shù)的選項(xiàng),你必須使用兩次`-Xlinker',一次傳遞選項(xiàng),另一次傳遞他的參數(shù).例如,如果傳遞`-assertdefinitions',你必須寫成`-Xlinker-assert-Xlinkerdefinitions',而不能寫成`-Xlinker"-assertdefinitions"',因?yàn)檫@樣會(huì)把整個(gè)字符串當(dāng)做一個(gè)參數(shù)傳遞,顯然這不是連接器期待的.-Wl,option把選項(xiàng)option傳遞給連接器.如果option中含有逗號(hào),就在逗號(hào)處分割成多個(gè)選項(xiàng).

-usymbol使連接器認(rèn)為取消了symbol的符號(hào)定義,從而連接庫模塊以取得定義.你可以使用多個(gè)`-u‘選項(xiàng),各自跟上不同的符號(hào),使得連接器調(diào)入附加的庫模塊.(注意這個(gè)規(guī)則指對(duì)GNU有效,對(duì)GHS的編譯器含義是不一樣的)舉例:在一個(gè)link文件中有:-uhardware_init_continue-uVectorTable作用:將使得原來的函數(shù)定義失效,而尋找其他庫中的同名函數(shù)。問題:這樣做的好處是作用是什么?

目錄選項(xiàng)(DIRECTORYOPTION)

下列選項(xiàng)指定搜索路徑,用于查找頭文件,庫文件,或編譯器的某些成員:-Idir在頭文件的搜索路徑列表中添加dir目錄.

舉例:gccmyapp.c–I/home/fred/include–omyapp-I-任何在`-I-'前面用`-I'選項(xiàng)指定的搜索路徑只適用于`#include"file"'這種情況;他們不能用來搜索`#include<file>'包含的頭文件.如果用`-I'選項(xiàng)指定的搜索路徑位于`-I-'選項(xiàng)后面,就可以在這些路徑中搜索所有的`#include'指令.(一般說來-I選項(xiàng)就是這么用的.)

還有,`-I-‘選項(xiàng)能夠阻止當(dāng)前目錄(存放當(dāng)前輸入文件的地方)成為搜索`#include“file”’的第一選擇(-I前面的才是第一選擇).沒有辦法克服`-I-'選項(xiàng)的這個(gè)效應(yīng).你可以指定`-I.'搜索那個(gè)目錄,它在調(diào)用編譯器時(shí)是當(dāng)前目錄.這和預(yù)處理器的默認(rèn)行為不完全一樣,但是結(jié)果通常令人滿意.

`-I-'不影響使用系統(tǒng)標(biāo)準(zhǔn)目錄,因此,`-I-'和`-nostdinc'是不同的選項(xiàng).

-Ldir在`-l‘選項(xiàng)的搜索路徑列表中添加dir目錄.舉例:gccmyapp.c–L/home/fred/lib–omyapp-Bprefix這個(gè)選項(xiàng)指出在何處尋找可執(zhí)行文件,庫文件,以及編譯器自己的數(shù)據(jù)文件.編譯器驅(qū)動(dòng)程序需要執(zhí)行某些下面的子程序:`cpp',`cc1'(或C++的`cc1plus'),`as'和`ld'.他把prefix當(dāng)作欲執(zhí)行的程序的前綴,既可以包括也可以不包括`machine/version/'.

對(duì)于要運(yùn)行的子程序,編譯器驅(qū)動(dòng)程序首先試著加上`-B‘所定義的前綴(如果存在).如果沒有找到文件,或沒有指定`-B'選項(xiàng),編譯器接著會(huì)試驗(yàn)兩個(gè)標(biāo)準(zhǔn)前綴`/usr/lib/gcc/'和`/usr/local/lib/gcc-lib/'.如果仍然沒能夠找到所需文件,編譯器就在`PATH'環(huán)境變量指定的路徑中尋找沒加任何前綴的文件名.如果有需要,運(yùn)行時(shí)(run-time)支持文件`libgcc.a'也在`-B'前綴的搜索范圍之內(nèi).如果這里沒有找到,就在上面提到的兩個(gè)標(biāo)準(zhǔn)前綴中尋找,僅此而已.如果上述方法沒有找到這個(gè)文件,就不連接他了.多數(shù)情況的多數(shù)機(jī)器上,`libgcc.a'并非必不可少.

你可以通過環(huán)境變量GCC_EXEC_PREFIX獲得近似的效果;如果定義了這個(gè)變量,其值就和上面說的一樣用做前綴.如果同時(shí)指定了`-B'選項(xiàng)和GCC_EXEC_PREFIX變量,編譯器首先使用`-B'選項(xiàng),然后才嘗試環(huán)境變量值.

警告選項(xiàng)(WARNINGOPTION)

警告是針對(duì)程序結(jié)構(gòu)的診斷信息,程序不一定有錯(cuò)誤,而是存在風(fēng)險(xiǎn),或者可能存在錯(cuò)誤.下列選項(xiàng)控制GNUCC產(chǎn)生的警告的數(shù)量和類型:-fsyntax-only檢查程序中的語法錯(cuò)誤,但是不產(chǎn)生輸出信息.演示:gcc-fsyntax-onlyhelloBad.c-w禁止所有警告信息.-Wno-import禁止所有關(guān)于#import的警告信息.-pedantic打開完全服從ANSIC標(biāo)準(zhǔn)所需的全部警告診斷;拒絕接受采用了被禁止的語法擴(kuò)展的程序.無論有沒有這個(gè)選項(xiàng),符合ANSIC標(biāo)準(zhǔn)的程序應(yīng)該能夠被正確編譯(雖然極少數(shù)程序需要`-ansi'選項(xiàng)).然而,如果沒有這個(gè)選項(xiàng),某些GNU擴(kuò)展和傳統(tǒng)C特性也得到支持.使用這個(gè)選項(xiàng)可以拒絕這些程序.沒有理由使用這個(gè)選項(xiàng),他存在只是為了滿足一些書呆子(pedant).演示:gcc-pedanticpedant.c-opedant對(duì)于替選關(guān)鍵字(他們以`__'開始和結(jié)束)`-pedantic'不會(huì)產(chǎn)生警告信息.Pedantic也不警告跟在__extension__后面的表達(dá)式.不過只應(yīng)該在系統(tǒng)頭文件中使用這種轉(zhuǎn)義措施,應(yīng)用程序最好避免.

-pedantic-errors該選項(xiàng)和`-pedantic'類似,但是顯示錯(cuò)誤而不是警告.-W對(duì)下列事件顯示額外的警告信息:1)非易變自動(dòng)變量(nonvolatileautomaticvariable)可能在調(diào)用longjmp時(shí)發(fā)生改變.這些警告僅在優(yōu)化編譯時(shí)發(fā)生.編譯器只知道對(duì)setjmp的調(diào)用,他不可能知道會(huì)在哪里調(diào)用longjmp,事實(shí)上一個(gè)信號(hào)處理例程可以在程序的任何地點(diǎn)調(diào)用他.其結(jié)果是,即使程序沒有問題,你也可能會(huì)得到警告,因?yàn)闊o法在可能出現(xiàn)問題的地方調(diào)用longjmp.2)既可以返回值,也可以不返回值的函數(shù).(缺少結(jié)尾的函數(shù)體被看作不返回函數(shù)值)例如,下面的函數(shù)將導(dǎo)致這種警告:

foo(a){if(a>0)returna;}

由于GNUCC不知道某些函數(shù)永不返回(含有abort和longjmp),因此有可能出現(xiàn)虛假警告.3)表達(dá)式語句或逗號(hào)表達(dá)式的左側(cè)沒有產(chǎn)生作用(sideeffect).如果要防止這種警告,應(yīng)該把未使用的表達(dá)式強(qiáng)制轉(zhuǎn)換為void類型.例如,這樣的表達(dá)式`x[i,j]'會(huì)導(dǎo)致警告,而`x[(void)i,j]'就不會(huì).4)無符號(hào)數(shù)用`>'或`<='和零做比較.-Wimplicit-int警告沒有指定類型的聲明.

-Wimplicit-function-declaration警告在聲明之前就使用的函數(shù).

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

-Wmain如果把main函數(shù)聲明或定義成奇怪的類型,編譯器就發(fā)出警告.典型情況下,這個(gè)函數(shù)用于外部連接,返回int數(shù)值,不需要參數(shù),或指定兩個(gè)參數(shù).

-Wreturn-type如果函數(shù)定義了返回類型,而默認(rèn)類型是int型,編譯器就發(fā)出警告.同時(shí)警告那些不帶返回值的return語句,如果他們所屬的函數(shù)并非void類型.

-Wunused如果某個(gè)局部變量除了聲明就沒再使用,或者聲明了靜態(tài)函數(shù)但是沒有定義,或者某條語句的運(yùn)算結(jié)果顯然沒有使用,編譯器就發(fā)出警告.

-Wswitch如果某條switch語句的參數(shù)屬于枚舉類型,但是沒有對(duì)應(yīng)的case語句使用枚舉元素,編譯器就發(fā)出警告.(default語句的出現(xiàn)能夠防止這個(gè)警告.)超出枚舉范圍的case語句同樣會(huì)導(dǎo)致這個(gè)警告.

ment如果注釋起始序列`/*‘出現(xiàn)在注釋中,編譯器就發(fā)出警告.(就是/*Iam/*aboy*/)-Wtrigraphs警告任何出現(xiàn)的trigraph(假設(shè)允許使用他們).

-Wformat檢查對(duì)printf和scanf等函數(shù)的調(diào)用,確認(rèn)各個(gè)參數(shù)類型和格式串中的一致.

-Wchar-subscripts警告類型是char的數(shù)組下標(biāo).這是常見錯(cuò)誤,程序員經(jīng)常忘記在某些機(jī)器上char有符號(hào).-Wuninitialized在初始化之前就使用變量.這些警告只可能做優(yōu)化編譯時(shí)出現(xiàn),因?yàn)樗麄冃枰獢?shù)據(jù)流信息,只有做優(yōu)化的時(shí)候才估算數(shù)據(jù)流信息.如果不指定`-O'選項(xiàng),就不會(huì)出現(xiàn)這些警告這些警告僅針對(duì)等候分配寄存器的變量.因此不會(huì)發(fā)生在聲明為volatile的變量上面,不會(huì)發(fā)生在已經(jīng)取得地址的變量,或長(zhǎng)度不等于1,2,4,8字節(jié)的變量.同樣也不會(huì)發(fā)生在結(jié)構(gòu),聯(lián)合或數(shù)組上面,即使他們?cè)诩拇嫫髦?

注意,如果某個(gè)變量只計(jì)算了一個(gè)從未使用過的值,這里可能不會(huì)警告.因?yàn)樵陲@示警告之前,這樣的計(jì)算已經(jīng)被數(shù)據(jù)流分析刪除了.這些警告作為可選項(xiàng)是因?yàn)镚NUCC還沒有智能到判別所有的情況,知道有些看上去錯(cuò)誤的代碼其實(shí)是正確的.下面是一個(gè)這樣的例子:{

intx;switch(y){case1:x=1;break;case2:x=4;break;case3:x=5;}foo(x);}

如果y始終是1,2或3,那么x總會(huì)被初始化,但是GNUCC不知道這一點(diǎn).下面是另一個(gè)普遍案例:{

intsave_y;if(change_y)save_y=y,y=new_y;...if(change_y)y=save_y;}這里沒有錯(cuò)誤,因?yàn)橹挥性O(shè)置了save_y才使用他.把所有不返回的函數(shù)定義為volatile可以避免某些似是而非的警告.-Wparentheses在某些情況下如果忽略了括號(hào),編譯器就發(fā)出警告.

-Wtemplate-debugging當(dāng)在C++程序中使用template的時(shí)候,如果調(diào)試(debugging)沒有完全生效,編譯器就發(fā)出警告.(僅用于C++).-Wall結(jié)合所有上述的`-W‘選項(xiàng)(就是說上面的都要報(bào)出來).通常我們建議避免這些被警告的用法,我們相信,恰當(dāng)結(jié)合宏的使用能夠輕易避免這些用法。

剩下(下一頁開始)的`-W...'選項(xiàng)不包括在`-Wall'中,因?yàn)槲覀冋J(rèn)為在必要情況下,這些被編譯器警告的程序結(jié)構(gòu),可以合理的用在"干凈的"程序中.(以下內(nèi)容過得比較快一些)-Wtraditional如果某些程序結(jié)構(gòu)在傳統(tǒng)C中的表現(xiàn)和ANSIC不同,編譯器就發(fā)出警告.

1)宏參出現(xiàn)在宏體的字符串常量?jī)?nèi)部.傳統(tǒng)C會(huì)替換宏參,而ANSIC則視其為常量的一部分.2)某個(gè)函數(shù)在塊(block)中聲明為外部,但在塊結(jié)束后才調(diào)用.

3)switch語句的操作數(shù)類型是long.-Wshadow一旦某個(gè)局部變量屏蔽了另一個(gè)局部變量,編譯器就發(fā)出警告.-Wpointer-arith任何語句如果依賴于函數(shù)類型的大小(size)或者void類型的大小,編譯器就發(fā)出警告.GNUC為了便于計(jì)算void*指針和函數(shù)指針,就把這些類型的大小定義為1.

-Wcast-qual一旦某個(gè)指針強(qiáng)制類型轉(zhuǎn)換以便移除類型修飾符時(shí),編譯器就發(fā)出警告.例如,如果把constchar*強(qiáng)制轉(zhuǎn)換為普通的char*時(shí),警告就會(huì)出現(xiàn).-Wcast-align一旦某個(gè)指針類型強(qiáng)制轉(zhuǎn)換時(shí),導(dǎo)致目標(biāo)所需的地址對(duì)齊(alignment)增加,編譯器就發(fā)出警告.例如,某些機(jī)器上只能在2或4字節(jié)邊界上訪問整數(shù),如果在這種機(jī)型上把char*強(qiáng)制轉(zhuǎn)換成int*類型,編譯器就發(fā)出警告.

-Wwrite-strings規(guī)定字符串常量的類型是constchar[length],因此,把這樣的地址復(fù)制給non-constchar*指針將產(chǎn)生警告.這些警告能夠幫助你在編譯期間發(fā)現(xiàn)企圖寫入字符串常量的代碼,但是你必須非常仔細(xì)的在聲明和原形中使用const,否則他們只能帶來麻煩;所以我們沒有讓`-Wall'提供這些警告.

-Wconversion如果某函數(shù)原形導(dǎo)致的類型轉(zhuǎn)換和無函數(shù)原形時(shí)的類型轉(zhuǎn)換不同,編譯器就發(fā)出警告.這里包括定點(diǎn)數(shù)和浮點(diǎn)數(shù)的互相轉(zhuǎn)換,改變定點(diǎn)數(shù)的寬度或符號(hào),除非他們和缺省聲明(defaultpromotion)相同.-Waggregate-return如果定義或調(diào)用了返回結(jié)構(gòu)或聯(lián)合的函數(shù),編譯器就發(fā)出警告.(從語言角度你可以返回一個(gè)數(shù)組,然而同樣會(huì)導(dǎo)致警告.)

-Wstrict-prototypes如果函數(shù)的聲明或定義沒有指出參數(shù)類型,編譯器就發(fā)出警告.(如果函數(shù)的前向引用說明指出了參數(shù)類型,則允許后面使用舊式風(fēng)格的函數(shù)定義,而不會(huì)產(chǎn)生警告.)

-Wmissing-prototypes如果沒有預(yù)先聲明函數(shù)原形就定義了全局函數(shù),編譯器就發(fā)出警告.即使函數(shù)定義自身提供了函數(shù)原形也會(huì)產(chǎn)生這個(gè)警告.他的目的是檢查沒有在頭文件中聲明的全局函數(shù).-Wmissing-declarations如果沒有預(yù)先聲明就定義了全局函數(shù),編譯器就發(fā)出警告.即使函數(shù)定義自身提供了函數(shù)原形也會(huì)產(chǎn)生這個(gè)警告.這個(gè)選項(xiàng)的目的是檢查沒有在頭文件中聲明的全局函數(shù).

-Wredundant-decls如果在同一個(gè)可見域某定義多次聲明,編譯器就發(fā)出警告,即使這些重復(fù)聲明有效并且毫無差別.

-Wnested-externs如果某extern聲明出現(xiàn)在函數(shù)內(nèi)部,編譯器就發(fā)出警告.

-Wlong-long如果使用了longlong類型就發(fā)出警告.該警告是缺省項(xiàng).使用`-Wno-long-long'選項(xiàng)能夠防止這個(gè)警告.`-Wlong-long'和`-Wno-long-long'僅在`-pedantic'之下才起作用.-Winline如果某函數(shù)不能內(nèi)嵌(inline),無論是聲明為inline或者是指定了-finline-functions選項(xiàng),編譯器都將發(fā)出警告.

-Werror視警告為錯(cuò)誤;出現(xiàn)任何警告即放棄編譯.

調(diào)試選項(xiàng)(DEBUGGINGOPTION)-g以操作系統(tǒng)的本地格式(stabs,COFF,XCOFF,或DWARF).產(chǎn)生調(diào)試信息.GDB能夠使用這些調(diào)試信息.在大多數(shù)使用stabs格式的系統(tǒng)上,`-g'選項(xiàng)啟動(dòng)只有GDB才使用的額外調(diào)試信息;這些信息使GDB調(diào)試效果更好,但是有可能導(dǎo)致其他調(diào)試器崩潰,或拒絕讀入程序.如果你確定要控制是否生成額外的信息,使用`-gstabs+',`-gstabs',`-gxcoff+',`-gxcoff',`-gdwarf+',或`-gdwarf'和大多數(shù)C編譯器不同,GNUCC允許結(jié)合使用`-g‘和`-O’選項(xiàng)(也就是說調(diào)試優(yōu)化過的代碼).優(yōu)化的代碼偶爾制造一些驚異的結(jié)果:某些聲明過的變量根本不存在;控制流程直接跑到?jīng)]有預(yù)料到的地方;某些語句因?yàn)橛?jì)算結(jié)果是常量或已經(jīng)確定而沒有執(zhí)行;某些語句在其他地方執(zhí)行,因?yàn)樗麄儽灰频窖h(huán)外面了

然而它證明了調(diào)試優(yōu)化的輸出是可能的.對(duì)可能含有錯(cuò)誤的程序使用優(yōu)化器是合理的.如果GNUCC支持輸出多種調(diào)試信息,下面的選項(xiàng)則非常有用.

-ggdb以本地格式(如果支持)輸出調(diào)試信息,盡可能包括GDB擴(kuò)展.

-gstabs以stabs格式(如果支持)輸出調(diào)試信息,不包括GDB擴(kuò)展.這是大多數(shù)BSD系統(tǒng)上DBX使用的格式.演示:objdump--stabshello.o-gstabs+以stabs格式(如果支持)輸出調(diào)試信息,使用只有GNU調(diào)試器(GDB)理解的GNU擴(kuò)展.使用這些擴(kuò)展有可能導(dǎo)致其他調(diào)試器崩潰或拒絕讀入程序.-gcoff以COFF格式(如果支持)輸出調(diào)試信息.這是在SystemV第四版以前的大多數(shù)SystemV系統(tǒng)上SDB使用的格式.

-gxcoff以XCOFF格式(如果支持)輸出調(diào)試信息.這是IBMRS/6000系統(tǒng)上DBX調(diào)試器使用的格式.

-gxcoff+以XCOFF格式(如果支持)輸出調(diào)試信息,使用只有GNU調(diào)試器(GDB)理解的GNU擴(kuò)展.使用這些擴(kuò)展有可能導(dǎo)致其他調(diào)試器崩潰或拒絕讀入程序.-gdwarf以DWARF格式(如果支持)輸出調(diào)試信息.這是大多數(shù)SystemV第四版系統(tǒng)上SDB使用的格式.

(這種格式是和stabs格式對(duì)立的,兩者只能有一個(gè))-gdwarf+以DWARF格式(如果支持)輸出調(diào)試信息,使用只有GNU調(diào)試器(GDB)理解的GNU擴(kuò)展.使用這些擴(kuò)展有可能導(dǎo)致其他調(diào)試器崩潰或拒絕讀入程序.-glevel-ggdblevel-gstabslevel-gcofflevel-gxcofflevel

-gdwarflevel請(qǐng)求生成調(diào)試信息,同時(shí)用level指出需要多少信息.默認(rèn)的level值是2.Level1輸出最少量的信息,僅夠在不打算調(diào)試的程序段內(nèi)backtrace.包括函數(shù)和外部變量的描述,但是沒有局部變量和行號(hào)信息.Level3包含更多的信息,如程序中出現(xiàn)的所有宏定義.當(dāng)使用`-g3'選項(xiàng)的時(shí)候,某些調(diào)試器支持宏擴(kuò)展.-p產(chǎn)生額外代碼,用于輸出profile信息,供分析程序prof使用.-pg產(chǎn)生額外代碼,用于輸出profile信息,供分析程序gprof使用.

主要是分析函數(shù)的調(diào)用的頻率的工具.

演示:gcc-pghello.c-ohelloGprof./helloGprof

gprofhelloGprof-a產(chǎn)生額外代碼,用于輸出基本塊(basicblock)的profile信息,它記錄各個(gè)基本塊的執(zhí)行次數(shù),供諸如tcov此類的程序分析.但是注意,這個(gè)數(shù)據(jù)格式并非tcov期待的.最終GNUgprof將處理這些數(shù)據(jù).-ax產(chǎn)生額外代碼,用于從'bb.in'文件讀取基本塊的profile參數(shù),把profile的結(jié)果寫到'bb.out'文件.`bb.in'包含一張函數(shù)列表.一旦進(jìn)入列表中的某個(gè)函數(shù),profile操作就開始,離開最外層的函數(shù)后,profile操作就結(jié)束.以`-'為前綴名的函數(shù)排除在profile操作之外.如果函數(shù)名不是唯一的,它可以寫成`/path/filename.d:functionname'來澄清.`bb.out'將列出一些有效的文件名.這四個(gè)函數(shù)名具有特殊含義:`__bb_jumps__'導(dǎo)致跳轉(zhuǎn)(jump)頻率寫進(jìn)`bb.out'.`__bb_trace__'導(dǎo)致基本塊序列通過管道傳到`gzip',輸出`bbtrace.gz'文件.`__bb_hidecall__'導(dǎo)致從跟蹤(trace)中排除call指令.`__bb_showret__'導(dǎo)致在跟蹤中包括返回指令.-save-temps保存那些通常是``臨時(shí)''的中間文件;置于當(dāng)前目錄下,并且根據(jù)源文件命名.因此,用`-c-save-temps'選項(xiàng)編譯`foo.c'會(huì)生成`foo.cpp'和`foo.s'以及`foo.o'文件.

-print-file-name=library顯示庫文件library的全路徑名,連接時(shí)會(huì)使用這個(gè)庫---其他什么事情都不作.根據(jù)這個(gè)選項(xiàng),GNUCC既不編譯,也不連接,僅僅顯示文件名.

-print-libgcc-file-name和`-print-file-name=libgcc.a‘一樣.演示:gcc-c-print-libgcc-file-namehello.c-print-prog-name=program類似于`-print-file-name',但是查找程序program如`cpp'.

優(yōu)化選項(xiàng)(OPTIMIZATIONOPTION)

-O-O1優(yōu)化.對(duì)于大函數(shù),優(yōu)化編譯占用稍微多的時(shí)間和相當(dāng)大的內(nèi)存.不使用`-O'選項(xiàng)時(shí),編譯器的目標(biāo)是減少編譯的開銷,使編譯結(jié)果能夠調(diào)試.語句是獨(dú)立的:如果在兩條語句之間用斷點(diǎn)中止程序,你可以對(duì)任何變量重新賦值,或者在函數(shù)體內(nèi)把程序計(jì)數(shù)器指到其他語句,以及從源程序中精確地獲取你期待的結(jié)果.不使用`-O'選項(xiàng)時(shí),只有聲明了register的變量才分配使用寄存器.編譯結(jié)果比不用`-O'選項(xiàng)的PCC要略遜一籌.

使用了`-O'選項(xiàng),編譯器會(huì)試圖減少目標(biāo)碼的大小和執(zhí)行時(shí)間.

如果指定了`-O‘選項(xiàng),`-fthread-jumps’和`-fdefer-pop‘(見后面的講解,講的是fnodefer_pop)選項(xiàng)將被打開.在有delayslot的機(jī)器上,`-fdelayed-branch'選項(xiàng)將被打開.在即使沒有幀指針(framepointer)也支持調(diào)試的機(jī)器上,`-fomit-frame-pointer'選項(xiàng)將被打開.某些機(jī)器上還可能會(huì)打開其他選項(xiàng).-O2多優(yōu)化一些.除了涉及空間和速度交換的優(yōu)化選項(xiàng),執(zhí)行幾乎所有的優(yōu)化工作.例如不進(jìn)行循環(huán)展開(loopunrolling)和函數(shù)內(nèi)嵌(inlining)(函數(shù)內(nèi)嵌是典型的空間換時(shí)間).和-O選項(xiàng)比較,這個(gè)選項(xiàng)既增加了編譯時(shí)間,也提高了生成代碼的運(yùn)行效果.

-O3優(yōu)化的更多.除了打開-O2所做的一切,它還打開了-finline-functions選項(xiàng).

演示:gcc-O3hello.c-ohello.op-O0不優(yōu)化.如果指定了多個(gè)-O選項(xiàng),不管帶不帶數(shù)字,最后一個(gè)選項(xiàng)才是生效的選項(xiàng).-fno-defer-pop一旦函數(shù)返回,參數(shù)就立即彈出.對(duì)于那些調(diào)用函數(shù)后必須彈出參數(shù)的機(jī)器,編譯器一般情況下讓幾次函數(shù)調(diào)用的參數(shù)

堆積在棧上,然后一次全部彈出.-fomit-frame-pointer對(duì)于不需要幀指針(framepointer)的函數(shù),不要在寄存器中保存幀指針.這樣能夠避免保存,設(shè)置和恢復(fù)幀指針的指令;同時(shí)對(duì)許多函數(shù)提供一個(gè)額外的寄存器.但是在大多數(shù)機(jī)器上將無法調(diào)試.某些機(jī)器上,如Vax,這個(gè)選項(xiàng)無效,因?yàn)闃?biāo)準(zhǔn)調(diào)用序列自動(dòng)處理幀指針,通過假裝不存在而不保存任何東西.機(jī)器描述宏

FRAME_POINTER_REQUIRED控制目標(biāo)機(jī)是否支持這個(gè)選項(xiàng).-finline-functions把所有簡(jiǎn)單的函數(shù)集成進(jìn)調(diào)用者.編譯器探索式地決定哪些函數(shù)足夠簡(jiǎn)單,值得這種集成.如果集成了所有給定函數(shù)的調(diào)用,而且函數(shù)聲明為static,那么一般說來GCC有權(quán)不按匯編代碼輸出函數(shù).

-fcaller-saves允許在寄存器里分配數(shù)值(也就是保存堆棧中的寄存器值),但是這個(gè)方案通常受到各個(gè)函數(shù)調(diào)用的沖擊,因此GCC生成額外的代碼,在函數(shù)調(diào)用的前后保存和復(fù)原寄存器內(nèi)容.僅當(dāng)生成代碼看上去優(yōu)于反之結(jié)果時(shí)才實(shí)現(xiàn)這樣的分配.某些機(jī)器上該選項(xiàng)默認(rèn)為允許,通常這些機(jī)器沒有調(diào)用保護(hù)寄存器代替使用.

-fkeep-inline-functions即使集成了某個(gè)函數(shù)的所有調(diào)用,而且該函數(shù)聲明為static,仍然輸出這個(gè)函數(shù)一個(gè)獨(dú)立的,運(yùn)行時(shí)可調(diào)用的版本.

(把inline函數(shù)作為存在的函數(shù),保存它的副本,不是內(nèi)嵌后就消失本身)-fno-function-cse不要把函數(shù)地址存入寄存器;讓調(diào)用固定函數(shù)的指令顯式給出函數(shù)地址(使得程序永遠(yuǎn)可以跳到正確的函數(shù)中去).這個(gè)選項(xiàng)產(chǎn)生效率較低的目標(biāo)碼,但是如果不用這個(gè)選項(xiàng),某些不尋常的hack,改變匯編器的輸出,可能因優(yōu)化而帶來困惑.(防止黑客改變匯編代碼)

-fno-peephole禁止任何機(jī)器相關(guān)的peephole優(yōu)化.Peephole:窺視孔,掃描已生成的代碼,找到那些沒有效率的指令組合,并用更好的高效的指令組合取代它們。而這種方法被稱為窺視孔優(yōu)化法的原因就在于它一次只在一小組指令中查找。下列選項(xiàng)控制特定的優(yōu)化.`-O2'選項(xiàng)打開下面的大多數(shù)優(yōu)化項(xiàng),除了`-funroll-loops'和`-funroll-all-loops'項(xiàng).

而`-O'選項(xiàng)通常打開`-fthread-jumps'和`-fdelayed-branch'優(yōu)化項(xiàng),但是特定的機(jī)器上的默認(rèn)優(yōu)化項(xiàng)有可能改變.

如果特別情況下非常需要``微調(diào)''優(yōu)化,你可以使用下面的選項(xiàng).

-fstrength-reduce執(zhí)行循環(huán)強(qiáng)度縮小(loopstrengthreduction)優(yōu)化,并且消除重復(fù)變量.

-fthread-jumps執(zhí)行優(yōu)化的地點(diǎn)是,如果某個(gè)跳轉(zhuǎn)分支的目的地存在另一個(gè)條件比較,而且該條件比較包含在前一個(gè)比較語句之內(nèi),那么執(zhí)行優(yōu)化.根據(jù)條件是true或者false,前面那條分支重定向到第二條分支的目的地(也就是說只有一條重定向了,而不再是兩條,這是true的情況)或者緊跟在第二條分支后面(這是false的情況).-funroll-loops執(zhí)行循環(huán)展開(loopunrolling)優(yōu)化.僅對(duì)循環(huán)次數(shù)能夠在編譯時(shí)或運(yùn)行時(shí)確定的循環(huán)實(shí)行.

-funroll-all-loops執(zhí)行循環(huán)展開(loopunrolling)優(yōu)化.對(duì)所有循環(huán)實(shí)行.通常使程序運(yùn)行的更慢.-fexpensive-optimizations執(zhí)行一些相對(duì)開銷較大的次要優(yōu)化.

-fdelayed-branch如果對(duì)目標(biāo)機(jī)支持這個(gè)功能,它試圖重新排列指令,以便利用延遲分支(delayedbranch)指令后面的指令空隙.(見show1)目標(biāo)機(jī)選項(xiàng)(TARGETOPTION)缺省情況下,GNUCC編譯出本機(jī)類型的目標(biāo)碼.然而也可以把他安裝成交叉編譯器,為其他機(jī)型編譯程序.事實(shí)上,針對(duì)不同的目標(biāo)機(jī),可以同時(shí)安裝GNUCC相應(yīng)的配置.然后用`-b'選項(xiàng)指定目標(biāo)機(jī)種.-bmachine參數(shù)machine指出編譯的目標(biāo)機(jī)種.這個(gè)選項(xiàng)用于安裝為交叉編譯器的GNUCC.參數(shù)machine的值和配置GNUCC交叉編譯器時(shí)設(shè)置的機(jī)器類型一樣.例如,如果交叉編譯器配置有`configurei386v',意思是編譯80386上的SystemV目標(biāo)碼,那么你可以通過`-bi386v'運(yùn)行交叉編譯器.

-Vversion參數(shù)version指出運(yùn)行哪個(gè)版本的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論