<序 >
偉大的GNU認為man手冊是Open Source發展的過時產物, 於是他們針對各種當家軟體出了各自的手冊, 如GNU Emacs, GNU Vim, 當然gcc是不可缺少的, 這是Stallman一生最偉大的產物之一.
Richard Stallman 是Open Source界的偉大人物之一, 他是gcc, gdb, emacs的作者, 名聲在OS界不可謂不大. 有一次, 他去某企業面試, 面試方問他, 你會用gdb嗎? Stallman一語驚人: 會, 那就是我寫的.
好了, 閑話少說, 還是說gcc吧.
1. 前言:
gcc是一款編譯器, 它主要在UNIX-BASE的系統上使用, windows版也有, 整合在MinGW中, 為了把GNU推廣到Windows, 真是煞費苦心啊.
gcc編譯器主要用於編譯C和C++程式, 編譯C++程式時通常使用g++命令, 實際上是gcc串連了libstdc++庫.
編譯命令:
gcc [option | filename]
g++ [option | filename]
2. 編譯步驟:
gcc編譯器在編譯時間, 都需要用四個步驟裡的一個或多個處理輸入檔案, 這四個步驟是:
- 預先處理(Pre-Processing)
- 編譯(Compilation)
- 彙編(Assembly)
- 串連(Linking)
在這個過程中, 源檔案的尾碼名控制著編譯器的預設設定. 這個尾碼指示出了程式碼所用語言
- gcc: 認為預先處理後的檔案(.i)是C檔案.
- g++: 認為預先處理後的檔案(.i)是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, 否則串連總是最後的步驟.
3. 選項總覽:
選項必須分立給出: `-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 -sion -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
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-divi
4. 總體選項介紹:
-x language
明確指出原始碼所使用的語言為language, 而不通過檔案尾碼處理. 這個選項後使選項後面的檔案都按照這個language語言判斷, 直到遇到下一個-x. language的可選值有: `c', `objective-c', `c-header', `c++', `cpp-output', `assembler',和`assembler-with-cpp'
-x none
關閉任何對於語言的說明, 依然檔案尾碼處理後面的檔案.
-c
編譯或彙編源檔案, 產生目標檔案(.o), 但不做串連. 這個選項同時也會使gcc忽略-c後面無法識別的檔案.(它們不需要編譯或彙編)
-S
編譯後停止而不進行彙編, 產生組合語言檔案(.s).
-E
預先處理後停止而不進行編譯. 預先處理後的代碼送給標準輸出.
-o filename
指定輸出檔案為filename. 該選項不在乎GCC要產生什麼輸出, 無論是可執行檔, 目標檔案, 彙編檔案, 還是預先處理後的代碼. 如果沒有-o選項, 預設的輸出:
可執行檔: a.out
目標檔案: source.suffix產生source.o
彙編檔案: source.suffix產生source.s
-v
在標準出錯顯示編譯時間的指令, 並顯示GCC的版本.
-pipe
在編譯過程的不同階段使用管道而非臨時檔案進行通訊.
5. 語言選項:
這些選項表示C語言的不同標準, 又被稱為C語言的"方言".
-ansi
支援符合ANSI標準的C代碼. 這樣就會關閉一些關鍵字的使用, 如asm, typeof, inline等.
其他選項在使用到時陸續添加.
6. 預先處理選項:
下列選項針對C前置處理器. 某些選項必須和'-E'一起用, 因為他們的結果不能用於編譯.
-C
告訴處理器不要丟棄注釋, 與'-E'配合使用.
-P
告訴處理器不要產生#line命令, 與'-E'配合使用.
-M
告訴處理器產生一個make規則, 用於描述各目標檔案的依賴關係. 對於每個源檔案輸出一個make規則, 這個規則是根據#include產生的. '-M'選項隱含了'-E'.
-MG
把缺少的標頭檔按存在看待, 並且假定它們和源檔案在同一個目錄. 必須和'-M'一起使用.
-MM
和'-M'類似, 但輸出結果僅限於使用者標頭檔, 不包括系統標頭檔.
-MD
和'-M'類似, 但是把依賴資訊輸出在檔案中(.d), 同時繼續指定編譯工作.
-MMD
和'-MD'類似, 但輸出結果僅限於使用者標頭檔.
-H
除了其他普通操作, GCC顯示引用過的標頭檔名.
-Dmacro
定義宏macro, 宏的內容定義為字元'1'.
-Dmacro=defn
定義宏macro, 宏的內容定義為defn.
-Umacro
取消定義宏macro. '-U'選項在'-D'之後處理, 但是優先於'-include', '-imacros'.
-dM
輸出有效宏定義列表(預先處理結束時仍然有效宏定義).該選項需結合`-E'選項使用.
-dD
把所有的宏定義傳遞到輸出端,按照出現的順序顯示.
-dN
和'-dD'類似, 但是只顯示宏的名字, 而不顯示值.
7. 其他選項:
gcc與gdb, ld, dbx等都有驅動選項, 這些開發工具都為gcc提供了驅動介面.
-g
使編譯器進行debug編譯, 串連成的可執行檔可被gdb進行調試用.
-lLIB
使編譯器在串連時引用LIB庫, 這個庫可以是.so的動態庫, 也可以是.a的歸檔庫檔案. 通常庫的檔案名稱為libxxx.so或libxxx.a, 要串連這個庫只需要-lxxx, 而不用加lib.
-LPATH
使編譯器在串連庫的時候除了預設的庫搜尋路徑, 還可去PATH路徑搜尋.