在開始了解之前可以先問問自己下面幾個問題...
可以參考這個網站Makefiles (GNU make)
Makefile主要會包含
以下逐步解析Makefile的SOP
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
# 語言版本
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
SRCS=src/foo-test.c src/foo.c src/bar/bar.c
OBJS = $(SRCS:.c=.o)
DEPS = $(OBJS:.o=.d)
# 先把 .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 $@ $^
# 連結測試執行檔,依賴自身 .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)
TARGETS = src/foo-test libfoo.a libbar.a
.DEFAULT_GOAL = all
.PHONY: all
all: $(TARGETS)
https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
.DEFAULT_GOAL=
https://spin.atomicobject.com/makefile-c-projects/