GCC 是 Linux/Unix 下最常用的 C 編譯器。本文系統整理 **單文件編譯、多文件手動編譯、庫鏈接、Makefile 自動化** 四大場景,助你從「能跑」進化到「工程化構建」。
| 命令 | 產物 | 說明 |
|---|---|---|
gcc test.c | a.out | 默認輸出名 |
gcc -c test.c | test.o | 僅編譯,不鏈接 |
gcc test.c -o liu | liu | 指定可執行文件名 |
gcc -o liu test.c | liu | 參數順序無關 |
運行:./liu
# 鏈接 pthread
gcc test.c -o liu -lpthread
# 或
gcc -o liu test.c -lpthread
-l 後直接跟庫名(去掉 lib 前綴和 .so/.a 後綴)。gcc test.c -lpthread),否則鏈接器可能找不到符號。假設項目:
main.c → 包含 one.h, two.h
one.c → 實現 one.h
two.c → 實現 two.h
gcc -c one.c # → one.o
gcc -c two.c # → two.o
gcc -c main.c # → main.o
gcc -o main main.o one.o two.o
./main
#include "one.h",編譯器優先搜當前目錄。.c,效率低。main: main.o one.o two.o
gcc -o main main.o one.o two.o
main.o: main.c one.h two.h
gcc -c main.c
one.o: one.c one.h
gcc -c one.c
two.o: two.c two.h
gcc -c two.c
make 自動推導依賴、增量編譯。CC = gcc
OBJS = main.o one.o two.o
main: $(OBJS)
$(CC) -o $@ $^
main.o: main.c one.h two.h
$(CC) -c $<
one.o: one.c one.h
$(CC) -c $<
two.o: two.c two.h
$(CC) -c $<
| 自動變量 | 含義 |
|---|---|
$@ | 目標文件 |
$< | 第一個依賴文件 |
$^ | 所有依賴文件 |
CC = gcc
OBJS = main.o one.o two.o
main: $(OBJS)
$(CC) -o $@ $^
.c.o:
$(CC) -c $<
clean:
rm -f main $(OBJS)
.c.o 內建規則:自動把 .c 編譯為同名 .o。make clean 一鍵清理產物。| 需求 | Makefile 寫法 |
|---|---|
| 調試版/發布版切換 | CFLAGS = -g -O0 / CFLAGS = -O2 -DNDEBUG |
| 自動生成依賴 | gcc -MM *.c > .depend 並 include .depend |
| 並行編譯 | make -j4(4 線程) |
| 安裝目標 | install: main; cp main /usr/local/bin/ |
gcc -o exe src.c。-lxxx 放最後。$@ $< $^、模式規則、clean,即可應付 90% 中小項目。