代码示例:
# File paths
SRC_DIR := ./src
BUILD_DIR := ./build
OBJ_DIR := $(BUILD_DIR)/obj
# Compilation flag
CC := gcc
LD := gcc
CFLAGS := -Wall
# Files to be compiled
SRCS := $(wildcard $(SRC_DIR)/*.c)
OBJS := $(SRCS:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
BUILD := $(OBJS:$(OBJ_DIR)/%.o=$(BUILD_DIR)/%)
# Don't remove *.o files automatically
.SECONDARY: $(OBJS)
all: $(BUILD)
# Compile each *.c file as *.o files
$(OBJ_DIR)/%.o:$(SRC_DIR)/%.c
@echo + CC $<
@mkdir -p $(OBJ_DIR)
@$(CC) $(CFLAGS) -c -o $@ $<
# Link each *.o file as executable files
$(BUILD_DIR)/%:$(OBJ_DIR)/%.o
@echo + LD $@
@mkdir -p $(BUILD_DIR)
@$(LD) $(CFLAGS) -o $@ $<
.PHONY:all clean
clean:
rm -rf $(BUILD_DIR)
效果:
|----test
|----src (*.c)
|----build (exe)
|----obj (*.o)
符号解析:
= 是最基本的赋值
:= 是覆盖之前的值
?= 是如果没有被赋值过就赋予等号后面的值
+= 是添加等号后面的值
$@ ——目标文件的名称;
$^ ——所有的依赖文件,以空格分开,不包含重复的依赖文件;
$< ——第一个依赖文件的名称。
wildcard : 扩展通配符
notdir : 去除路径
patsubst :替换通配符
.SECONDARY: $(OBJS) //make的时候是否保留中间文件 .o