代码示例:
# 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
Makefile实战:构建C项目
本文介绍了一个详细的Makefile示例,用于自动化构建C语言项目。通过使用wildcard、notdir、patsubst等函数,Makefile能够智能地处理源文件目录下的所有.c文件,生成对应的.o文件,并最终链接成可执行文件。文章还解释了Makefile中各种符号的含义,如$@、$^、$<等,以及.SECONDARY伪目标的作用。
1725

被折叠的 条评论
为什么被折叠?



