GCC (GNU Compiler Collection) 是 Linux 下最核心的編譯工具鏈。掌握其常用參數、庫鏈接機制、頭文件搜尋路徑、優化選項與環境變數,能大幅提升 C/C++ 開發效率。本文系統整理 GCC 實戰必知知識點。
| 命令 | 適用語言 | 說明 |
|---|---|---|
| gcc / cc | C | C 語言編譯器,cc 通常是 gcc 符號鏈接 |
| g++ / c++ | C++ | C++ 編譯器,自動鏈接 libstdc++ |
# 單檔編譯執行
gcc test.c -o test # 指定輸出檔名
./test # 執行
# 多檔分步編譯
gcc -c main.c -o main.o # 編譯為目標檔
gcc -c util.c -o util.o
gcc main.o util.o -o app # 鏈接生成可執行檔
此為**鏈接階段**錯誤,非編譯錯誤。表示程式碼語法正確,但找不到函式實現。需顯式指定鏈接庫。
# 鏈接數學庫 libm.so
gcc test.c -lm -o test
# 庫命名規則:lib<名稱>.so → -l<名稱>
# 例如 libtest.so → -ltest
# 指定庫搜尋路徑 (非標準路徑 /usr/lib, /usr/local/lib)
gcc test.c -L/aaa/bbb/ccc -ltest -o test
libm.so → libm.so.6 → libm-2.3.2.so
# 缺少 libxxx.so 符號鏈接時需手動建立
ln -s libxxx-1.2.3.so libxxx.so
# 列出支援的套件
pkg-config --list-all
# 獲取 GTK+ 編譯與鏈接參數
gcc gtktest.c `pkg-config gtk+-3.0 --cflags --libs` -o gtktest
# 等價於手動輸入:
# -I/usr/include/gtk-3.0 ... -lgtk-3 -lgdk-3 ...
# 指定頭文件目錄
gcc -I/myinclude test.c -o test
# 當前目錄
gcc -I. test.c -o test
# 強制包含頭文件 (少用)
gcc -include config.h test.c -o test
標準路徑 /usr/include 無需指定。pkg-config --cflags 可自動輸出 -I 參數。
| 參數 | 用途 | 建議 |
|---|---|---|
| -O2 | 優化等級 2 (速度/大小平衡) | 發布版預設 |
| -O3 | 激進優化 | 可能導致體積膨脹或數值誤差 |
| -Os | 優化體積 | 嵌入式/空間受限環境 |
| -g | 生成除錯資訊 | 開發階段必加 |
| -Wall -Wextra | 開啟常見警告 | 良好習慣 |
| -std=c11 / -std=c++17 | 指定語言標準 | 現代專案必設 |
| -shared -fPIC | 編譯動態庫 .so | gcc -shared -fPIC lib.c -o liblib.so |
| -static | 靜態鏈接 | 部署單檔案,體積較大 |
# pkg-config 搜尋 .pc 檔路徑
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/opt/qt/lib/pkgconfig
# 庫執行時搜尋路徑 (臨時)
export LD_LIBRARY_PATH=/usr/local/lib:/opt/lib
# 編譯器默認搜尋路徑
export C_INCLUDE_PATH=/usr/local/include
export CPLUS_INCLUDE_PATH=/usr/local/include
# 並行編譯加速
export MAKEFLAGS="-j$(nproc)"
# CMake 專案建議 (現代標準)
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make -j$(nproc)
# 手動 Makefile 關鍵變數
CC = gcc
CFLAGS = -O2 -Wall -std=c11 -I./include `pkg-config --cflags libxml-2.0`
LDFLAGS = `pkg-config --libs libxml-2.0` -lm -lpthread
TARGET = myapp
OBJS = main.o parser.o network.o
$(TARGET): $(OBJS)
$(CC) -o $@ $^ $(LDFLAGS)
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
GCC 參數看似繁多,實則邏輯清晰:**編譯階段管頭文件 (-I)、語言標準 (-std)、警告 (-Wall);鏈接階段管庫路徑 (-L)、庫名稱 (-l)、執行時路徑 (-Wl,-rpath)**。善用 pkg-config 與 CMake 管理複雜依賴,才是現代 C/C++ 開發的正確姿勢。
CentOS 6/7 掛載讀寫 NTFS 分區完整指南:啟用 EPEL/RPMForge 安裝 ntfs-3g
RedHat 5 使用 CentOS Yum 源完整配置教程(32位系統適用)
Linux 系統死機根因全景分析:從硬體排查到核心級除錯技術
CentOS 网络安装全自动化:PXE + DHCP + TFTP + Kickstart 零人值守部署实战
VCS 雙機啟動失敗排查:缺失 Samba 組件導致資源上線腳本報錯
Linux 進程優先級 NI 與 PR 深度解析:Nice 值、動態優先級與即時進程調度
Linux Shell 指令速查手冊:man、ls、cp、rm、mv、cd、cat、grep、find、tar、chmod、ps、kill 等核心指令