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版本號和版權資訊 |
|