iT邦幫忙

2025 iThome 鐵人賽

DAY 7
0
Software Development

30 天精通 C 語言建置與除錯:從 Makefile 到 CMake 跨平台實戰系列 第 7

[Day 07] 知道MAKE的功用了? 那我們先來看看別人怎麼寫Makefile!

  • 分享至 

  • xImage
  •  

在開始了解之前可以先問問自己下面幾個問題...

  • 寫MAKE有基本的SOP可以follow嗎? 有!
  • MAKEFILE的結構是啥? --> 請從 2 開始看
  • github 上面有機會找到也有在寫MAKE的人嗎? --> 請看2.1
  • 今天主要說MAKE基本架構,明天開始會開始細看每個架構的基本用法
  • 最終目標是當你看到一個全新的Makefile 你可以完全了解他的編譯邏輯!

1. MAKE 基本指令

1.1 MAKE 指令查詢方法

https://devdocs.io/gnu_make/
https://ithelp.ithome.com.tw/upload/images/20250906/201784841iW7J03pir.png

可以參考這個網站Makefiles (GNU make)

1.2 MAKE 文件的基本格式

Makefile主要會包含

  1. 指定的編譯器
  2. 編譯器版本/警告/除錯的條件
  3. SRCS
  4. 物件檔 / 依賴檔清單
  5. .PHONY
  6. 測試套件

2. Simple Makefile for c

以下逐步解析Makefile的SOP

2.1 指定編譯器

CC=gcc

通常 makefile的第一行會直接選擇編譯器的框架,以Linux 系統而言,通常是gcc windows 系統 (微軟系統) 通常會用 clang

  • gcc / g++(GNU Compiler Collection)
  • clang / clang++(LLVM/Clang)

如果想要有多系統適用的寫法可以以下

# macOS 常用 clang;多數 Linux 預設 gcc
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Darwin)
  CC  ?= clang
else
  CC  ?= gcc
endif

2.2 編譯器版本/警告/除錯的條件

# 語言版本
CFLAGS  += -std=c99  # 也可以選 c11 (2011).....

# 警告(建議漸進加強)
CFLAGS  += -Wall -Wextra -Wpedantic
# CFLAGS  += -Wshadow -Wformat=2 -Wundef -Wstrict-prototypes

# 除錯資訊 + 友善最佳化
CFLAGS  += -Og -g
# 開發期另可用:CFLAGS += -O0 -g

# 自動相依(一起開,供 -include 使用)
CPPFLAGS += -MMD -MP

2.3 SRCS

SRCS=src/foo-test.c src/foo.c src/bar/bar.c

2.4 物件檔 / 依賴檔清單

OBJS = $(SRCS:.c=.o)
DEPS = $(OBJS:.o=.d)

2.5 建靜態庫

# 先把 .c 編成 .o(樣板規則)
%.o: %.c
	$(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@

# 再把 .o 打包成 .a(簡易規則;並行時同一 .a 請避免同時寫入)
libbar.a: src/bar/bar.o
	ar rcs $@ $^

libfoo.a: src/foo.o
	ar rcs $@ $^

2.6 測試套件(可執行檔)

# 連結測試執行檔,依賴自身 .o + 靜態庫
src/foo-test: src/foo-test.o libfoo.a libbar.a
	$(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS)

TEST_SUITE = src/foo-test

.PHONY: test
test: $(TEST_SUITE)
	./$(TEST_SUITE)

2.7 預設執行 & .PHONY

TARGETS = src/foo-test libfoo.a libbar.a

.DEFAULT_GOAL = all
.PHONY: all
all: $(TARGETS)

https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

2.8 測試套件

2.9 預設執行

.DEFAULT_GOAL=

2.10 .PHONY

2.11 clean:

參考網站

https://spin.atomicobject.com/makefile-c-projects/


上一篇
[Day 06] 非得用MAKE不可嗎? 讓我們再來了解一下makefile
下一篇
[Day 08] WSL 安裝問題解決
系列文
30 天精通 C 語言建置與除錯:從 Makefile 到 CMake 跨平台實戰8
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言