GCC (GNU Compiler Collection) 是 Linux/Unix 系統上最主流的 C/C++ 編譯器。掌握其常用選項、編譯流程控制、調試與剖析技巧,能顯著提升開發效率與程式效能。
# 單步編譯鏈接
gcc test.c -o test
# 分步驟
gcc -c test.c -o test.o # 編譯+匯編 → 目標文件
gcc test.o -o test # 鏈接 → 可執行檔
| 類別 | 常用選項 | 說明 |
|---|---|---|
| 編譯控制 | -c | 僅編譯匯編,不鏈接 |
| -S | 僅編譯到匯編 (.s) | |
| -E | 僅預處理 (.i) | |
| -o file | 指定輸出檔名 | |
| 優化 | -O0 | 無優化 (預設),適合調試 |
| -O1 | 基礎優化 | |
| -O2 | 推薦發布等級,速度/體積平衡 | |
| -O3 | 激進優化 (向量化、積極內聯) | |
| -Os | 優化體積 (嵌入式首選) | |
| 調試/剖析 | -g | 生成 DWARF 調試資訊 (配合 GDB) |
| -ggdb | GDB 專用擴充調試資訊 | |
| -pg | 插桩生成 gprof 剖析數據 | |
| -fprofile-arcs -ftest-coverage | 代碼覆蓋率測試 (gcov) | |
| 警告/標準 | -Wall -Wextra | 開啟大多數建設性警告 |
| -Werror | 警告視為錯誤 | |
| -std=c11 / -std=c++17 | 指定語言標準 | |
| -pedantic | 嚴格 ISO 模式,拒絕 GNU 擴展 | |
| 預處理/頭文件 | -I dir | 新增頭文件搜尋路徑 |
| -D MACRO[=val] | 命令列定義宏 | |
| -MMD -MP | 自動生成 .d 依賴檔 (配合 Make) | |
| 鏈接/庫 | -L dir | 新增庫搜尋路徑 |
| -l name | 鏈接 libname.so/.a | |
| -static / -shared | 靜態/動態鏈接控制 |
# 編譯帶調試資訊
gcc -g -O0 test.c -o test
# 啟動 GDB
gdb ./test
# 核心指令
(gdb) break main # 斷點
(gdb) run arg1 arg2 # 執行帶參數
(gdb) next / step # 逐過 / 逐入
(gdb) print var # 印變數
(gdb) watch ptr # 監視變化
(gdb) bt # 呼叫堆疊
(gdb) info locals # 區域變數
(gdb) disassemble func # 反匯編
(gdb) set follow-fork-mode child # 調試子進程
# 1. 編譯插桩
gcc -pg -O2 test.c -o test
# 2. 執行生成 gmon.out
./test
# 3. 分析
gprof test gmon.out > profile.txt
# 或圖形化
gprof2dot.py profile.txt | dot -Tpng -o profile.png