GCC (GNU Compiler Collection) 是功能強大的編譯器套件,支持 C、C++、Java、Ada、Fortran 等多種語言。日常開發中常用 gcc 編譯 C 程序,g++ 編譯 C++ 程序(實際調用同一後端)。
| 參數 | 說明 |
|---|---|
-c | 只編譯不鏈接,生成目標文件 *.o |
-S | 生成匯編代碼文件 *.s |
-E | 只預處理,生成 *.i 文件(展開頭文件、宏替換等) |
-g | 在可執行文件中嵌入調試信息,供 GDB 使用 |
-o <file> | 指定輸出文件名 |
-static | 靜態鏈接庫 |
-l<library> | 鏈接名為 library 的動態/靜態庫 |
-O2/-O3 | 優化等級(-O2 推薦,-O3 激進優化) |
-Wall | 開啟常見警告 |
-std=c++17 | 指定語言標準 |
以 hello.c 為例:
-Egcc -E hello.c -o hello.i
生成 hello.i,內容包含展開後的頭文件、宏定義、行號標記(# 1 "hello.c" 等)。
-Sgcc -S hello.i -o hello.s
生成 hello.s,為 AT&T 語法匯編代碼(如 .section __TEXT,__text、_main:、pushq %rbp 等)。
-cgcc -c hello.s -o hello.o
生成二進制目標文件 hello.o(ELF/Mach-O 格式),不可直接閱讀,需用 objdump 或反彙編工具查看。
gcc hello.o -o hello
鏈接標準庫、啟動代碼等,產出最終可執行文件 hello(Linux/macOS)或 hello.exe(Windows)。
gcc hello.c -o hello
內部自動完成上述四步,生成最終可執行文件。
./hello # 運行 gdb ./hello # 調試(需編譯時加 -g)
.i:排查宏展開、頭文件包含順序、條件編譯問題。.s:分析編譯器優化效果、指令選擇、寄存器分配、內聯展開等。.o:用 nm 查看符號表、objdump -d 反彙編、size 查看段大小。理解 GCC 四階段編譯流程,能幫助開發者定位編譯錯誤、優化代碼、分析二進制體積、進行交叉編譯等高級任務。熟練掌握常用參數是 C/C++ 程序員的基本功。