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編譯命令選項以下表所示:oop
表1 GCC編譯命令經常使用選項性能
選項優化 |
描述spa |
命令示例操作系統 |
無命令行 |
將源文件預處理、編譯、彙編並連接造成可執行文件 |
[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版本號和版權信息 |