GNU gcc 使用手冊

來源:互聯網
上載者:User

<序 >  

偉大的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路徑搜尋.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.