首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

GCC 編譯 C 程序完全指南:從單文件到 Makefile 自動化構建

     編輯:關於C語言

前言

GCC 是 Linux/Unix 下最常用的 C 編譯器。本文系統整理 **單文件編譯、多文件手動編譯、庫鏈接、Makefile 自動化** 四大場景,助你從「能跑」進化到「工程化構建」。

一、單文件編譯

命令產物說明
gcc test.ca.out默認輸出名
gcc -c test.ctest.o僅編譯,不鏈接
gcc test.c -o liuliu指定可執行文件名
gcc -o liu test.cliu參數順序無關

運行:./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,效率低。

四、Makefile 自動化構建

1. 基礎版

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
  • 命令前**必須是 Tab 鍵**,不能用空格。
  • 運行 make 自動推導依賴、增量編譯。

2. 變量簡化版

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 $<
自動變量含義
$@目標文件
$<第一個依賴文件
$^所有依賴文件

3. 模式規則極簡版


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/

總結

  1. 單文件:gcc -o exe src.c。
  2. 鏈接庫:-lxxx 放最後。
  3. 多文件手動編譯麻煩,**Makefile 是標準解法**。
  4. 掌握 $@ $< $^、模式規則、clean,即可應付 90% 中小項目。
  5. 大型項目建議升級 CMake/Meson,但 Makefile 思維通用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved