GCC編譯命令常用選項


 GCC是GUN Compiler Collection的簡稱,除編譯程序外,還包含其他相關工具。GCC可將高級語言編寫的源代碼構建成計算機直接執行的二進制代碼。GCC是Linux平台下最常用的編譯程序,也是Linux平台編譯器的事實標准。GCC支持四十余種不同目標體系結構(如X86系列、ARM及PowerPC等),可運行在不同的操作系統上(如Linux、Solaris及Windows等)。GCC既支持基於宿主的開發(即在A平台上編譯該平台使用的程序),也支持交叉編譯(即在A平台上編譯供B平台使用的程序)。

     GCC最初含義為GNU C Compiler。但目前除C語言外,GCC還支持多種其他語言,如C++、Ada、Java、Objective-C、FORTRAN、Pascal、COBOL以及支持函數式編程和邏輯編程的Mercury語言等。

     對於GUN編譯器而言,程序的編譯經歷預處理(也稱預編譯,Preprocessing)、編譯(Compilation)、匯編(Assembly) 和鏈接(Linking)四個階段。在預處理階段,輸入C語言源文件(通常為*.c),該階段主要處理源文件中的#ifdef、 #include和#define命令,並生成中間文件*.i(實際中並不常用);在編譯階段,輸入中間文件*.i,編譯后生成匯編語言文件*.s;在匯編階段,將輸入的匯編文件*.s轉換成機器語言*.o;最后,在鏈接階段將輸入的機器代碼文件*.o(與其它機器代碼文件和庫文件)匯集成一個二進制可執行代碼文件

     實際操作上,GCC可將上述四步合並為一個步驟來執行。不同階段的C語言文件輸入輸出如下圖所示:

 

     常用的GCC編譯命令選項如下表所示:

表1 GCC編譯命令常用選項

選項

描述

命令示例

將源文件預處理、編譯、匯編並鏈接形成可執行文件

[e.g.1]gcc source.c

未指定輸出文件時默認輸出為a.out

[e.g.2]gcc source.c -o exec

將源文件source.c鏈接為可執行文件exec

[e.g.3]gcc test.o -o test

將編譯輸出文件source.o鏈接為可執行文件exec

-E

僅作預處理並直接顯示,不進行編譯、匯編和鏈接

[e.g.1]gcc -E source.c -o preproc.i

將源文件source.c預處理結果輸出到preproc.i文件

[e.g.2]gcc -E source.c > preproc.txt

將source.c預處理結果重定向到preproc.txt文件

注:”gcc -E”也可換為”cpp”(C preprocessor)

-S

預處理和編譯到匯編語言(自動生成.s文件),不進行匯編和鏈接

[e.g.1]gcc -S source.c

將源文件source.c匯編成source.s文件

[e.g.2]gcc -S preproc.i

將預處理輸出文件preproc.i匯編成preproc.s文件

-c

僅作預處理、編譯和匯編並生成目標文件(與源文件同名但后綴為.o),不進行鏈接

[e.g.1]gcc -c source.s

將匯編輸出文件source.s編譯輸出source.o文件

[e.g.2]gcc -c source.c -o target.o

編譯源文件source.c並將目標文件更名為target.o

-g

產生帶調試信息的編譯后目標代碼,供調試器(如gdb使用)

默認產生gdb所用的調試信息,可用-gformat指定要生成的調試信息格式以供其他平台其他調試器使用

[e.g.1]gcc -g source.c

將源文件編譯為帶調試信息的目標文件a.out

-o <OutFile>

指定輸出文件的文件名

[e.g.1]gcc -o source.exe source.c

[e.g.2]gcc -o source.asm source.c

-s

剝除可執行文件中的符號表和重定位信息

用於減小可執行文件的大小

-C

預處理時不刪除注釋信息

配合-E選項使用

-O

使用編譯優化級別1編譯程序。O后還可附帶其他的數值,表示不同的優化級別。級別越大優化效果越好,但編譯時間越長

-O0:無優化(默認) 。

-O和-O1:優化可執行文件大小及執行時間,且不使編譯時間明顯增加。編譯大型程序時會顯著增加編譯時內存的使用。

-O2:包含-O1的優化,並增加無需在目標文件大小和執行速度上進行折衷的優化。編譯器不執行循環展開及函數內聯,即不進行“空間換時間”的優化。該選項將增加編譯時間和目標文件的執行性能。

-Os:執行所有不增加目標文件大小的-O2選項,並執行專門減小目標文件大小的優化選項。

-O3: 打開所有-O2優化選項並且增加 -finline-functions, -funswitch-loops, -fpredictive-commoning, -fgcse-after-reload和-ftree-vectorize優化選項。

[e.g.1]gcc -O1 source.c -o exec

-shared

生成共享目標文件

用於建立共享鏈接庫

-w

禁止顯示任何警告信息

 

-Wall

顯示全部警告信息

 

-Wshadow

當局部變量遮蓋另一局部變量或全局變量時發出警告

比較有用,建議打開。 -Wall不會打開該項

-Wpointer-arith

對函數指針或void *類型的指針進行算術操作時發出警告

比較有用,建議打開。 -Wall不會打開該項

-Werror

把警告當作錯誤

出現任何警告就停止

-Wunreachable-code

探測到永不執行的代碼時發出警告

比較有用

-Wredundant-decls

同一可見域內某定義多次聲明時發出警告

即使這些重復聲明有效且毫無差別

-pedantic

對不符合 ANSI/ISO C標准且為標准所要求診斷之處發出警告

該選項可發現部分不符合ANSI/ISO C標准的代碼,如C++ style comments are not allowed in ISO C90

-m

生成文件關聯的信息,包含目標文件所依賴的所有源代碼

[e.g.1]gcc -m source.c

與-m類似的有:

-mm忽略由#include <file>造成的依賴關系;

-md將輸出導入到.d的文件里;

-mmd忽略由#include <file>造成的依賴關系,並將輸出導入到.d的文件里

-v

顯示鏈接過程中編譯器調用的程序

gcc編譯鏈接生成執行文件時,自動把該文件代碼作為第一個模塊鏈接在可執行程序中

--help

顯示gcc幫助說明

 

--target-help

顯示目標機器特定命令行選項

 

--version

顯示gcc版本號和版權信息

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM