源文件 (.c)
│
▼ 預處理
預處理文件 (.i) ──展開頭文件、宏替換、條件編譯
│
▼ 編譯
匯編文件 (.s) ──語法分析、優化、生成匯編代碼
│
▼ 匯編
目標文件 (.o/.obj) ──匯編器翻譯為機器指令、重定位表、符號表
│
▼ 鏈接
可執行文件 (.exe/.out) ──鏈接器合併多目標文件、解析符號、綁定庫、生成最終二進制
gcc -E# 開頭的指令:#include 展開頭文件、#define 宏替換、#ifdef/#endif 條件編譯。.i 文件(純 C 代碼,無預處理指令)。gcc -S.s(文本可讀)。gcc -c.o (Linux) / .obj (Windows),包含:
.a/.lib) 中被引用的目標模塊直接拷貝到可執行文件,體積大但無依賴。.so/.dll),體積小、易升級、內存共享。.exe (PE 格式) 或 .out (ELF 格式)。| 操作 | GCC/Clang (Linux/macOS/MinGW) | MSVC (Windows) |
|---|---|---|
| 僅預處理 | gcc -E hello.c -o hello.i | cl /E hello.c |
| 生成匯編 | gcc -S hello.c -o hello.s | cl /Fa hello.c |
| 編譯到目標文件 | gcc -c hello.c -o hello.o | cl /c hello.c |
| 完整編譯鏈接 | gcc hello.c -o hello | cl hello.c /Fehello.exe |
| 指定 C 標準 | gcc -std=c11 ... | cl /std:c11 ... |
| 開啟優化 | gcc -O2 ... | cl /O2 ... |
mainCRTStartup → main) 執行。int 3),啟動調試器附加進程,支持單步、監視、調用棧。| 階段 | 典型錯誤 | 關鍵詞 |
|---|---|---|
| 預處理 | 頭文件找不到、宏定義衝突 | fatal error: xxx.h: No such file |
| 編譯 | 語法錯誤、類型不匹配、未聲明標識符 | error: expected ';' before '}' token |
| 匯編 | 內聯匯編語法錯誤、寄存器衝突 | Error: operand type mismatch |
| 鏈接 | 未定義引用、重複定義、庫缺失 | undefined reference to `func' |
理解「預處理→編譯→匯編→鏈接」四階段,能幫你:
-c 只編譯不鏈接,-shared 生成動態庫)。建議在終端手動敲幾次 gcc -E/-S/-c 觀察中間產物,建立具體的心智模型。