編譯四階段
- 預處理:展開宏、包含頭文件、條件編譯 → 生成
.i 文件
- 編譯:預處理文件 → 匯編語言
.s
- 匯編:匯編語言 → 目標機器碼
.o
- 鏈接:目標文件 + 庫 → 可執行程序
控制編譯流程的參數
| 參數 | 作用 | 輸出 |
-E | 僅預處理 | 標準輸出(重定向到 .i) |
-S | 預處理 + 編譯,產生匯編 | .s 文件 |
-c | 預處理 + 編譯 + 匯編,不鏈接 | .o 目標文件 |
-o file | 指定輸出文件名 | 自定義 |
示例:
gcc -E hello.c > hello.i
gcc -S hello.c # 生成 hello.s
gcc -c hello.c # 生成 hello.o
gcc -o hello hello.c # 直接生成可執行文件 hello
常用優化與標準控制參數
| 參數 | 說明 |
-Wall | 開啟所有常見警告(強烈推薦) |
-O2 | 優化等級 2(速度/大小平衡,發布標配) |
-O3 | 激進優化,可能增大體積 |
-ansi | 嚴格 ANSI C 模式,禁用 GNU 擴展 |
-std=c99 / -std=c11 | 指定 C 標準版本 |
-fno-asm | 禁用 asm、inline、typeof 關鍵字 |
-fno-strict-prototype | C++:無參函數視為無顯式參數聲明(而非無參) |
宏定義與頭文件搜索路徑
-D MACRO:相當於 #define MACRO
-D MACRO=VALUE:相當於 #define MACRO VALUE
-U MACRO:取消宏定義
-I dir:添加頭文件搜索目錄(優先於系統目錄)
-include file:強制包含文件(如預編譯頭)
-imacros file:展開文件中的宏定義,但不包含文件內容
字符類型控制
-funsigned-char / -fsigned-char:指定 char 默認符號性(實現定義)