GCC 簡介
GNU Compiler Collection (GCC) 支持 C、C++、Objective-C、Fortran 等語言,跨平台、開源、優化能力強(-O2/-O3 通常比商業編譯器快 20-30%)。Linux 系統預裝,Windows 可用 MinGW-w64 或 MSYS2 獲取。
文件後綴識別規則
| 後綴 | 含義 |
.c | C 源文件 |
.cpp/.cc/.cxx/.C | C++ 源文件 |
.h/.hpp | 頭文件 |
.i | 預處理後的 C 源文件 |
.ii | 預處理後的 C++ 源文件 |
.s/.S | 匯編源文件(.S 經預處理) |
.o | 目標文件 |
.a/.so | 靜態庫 / 動態庫 |
Linux 可執行文件無固定後綴,由文件權限 x 位決定。
編譯四階段與常用選項
# 1. 預處理 (-E)
gcc -E hello.c -o hello.i
# 2. 編譯為匯編 (-S)
gcc -S hello.i -o hello.s
# 3. 匯編為目標文件 (-c)
gcc -c hello.s -o hello.o
# 4. 鏈接生成可執行文件
gcc hello.o -o hello
# 一步到位
gcc hello.c -o hello
| 選項 | 作用 | 推薦場景 |
-o file | 指定輸出文件名 | 必加 |
-c | 僅編譯不鏈接,產生 .o | 多文件專案分別編譯 |
-g | 生成調試符號 | 開發/調試階段必加 |
-O2 / -O3 | 優化等級 | 發布構建 |
-Wall -Wextra | 開啟大部分警告 | 全過程必加 |
-std=c++17 | 指定語言標準 | 現代 C++ 專案 |
-I/path | 添加頭文件搜索路徑 | 第三方庫 |
-L/path | 添加庫文件搜索路徑 | 第三方庫 |
-lname | 鏈接 libname.a/.so | 如 -lpthread |
-static | 靜態鏈接 | 部署無依賴環境 |
-DNAME=VALUE | 預定義宏 | 條件編譯 |
頭文件搜索機制
#include <header.h>:僅搜索系統默認路徑(/usr/include 等)及 -I 指定路徑。
#include "header.h":先搜索當前文件所在目錄,再搜索 -I 路徑,最後系統路徑。
庫鏈接順序陷阱
鏈接器按命令行順序解析符號,依賴庫必須放在被依賴者之後:
# 錯誤:undefined reference
gcc -lmylib main.o
# 正確:main.o 先出現,符號需求先產生
gcc main.o -lmylib
實戰範例:多文件專案構建
# 編譯階段
g++ -std=c++17 -Wall -O2 -I./include -c src/main.cpp -o build/main.o
g++ -std=c++17 -Wall -O2 -I./include -c src/util.cpp -o build/util.o
# 鏈接階段
g++ build/main.o build/util.o -L./lib -lmylib -o bin/app
環境變量補充