---- 整理自狄泰软件唐佐林老师课程
1. 目标
- 自动生成 target 文件夹存放可执行文件
- 自动生成 objs 文件夹存放编译生成的目标文件(*.o)
- 支持调试版本的编译选项
- 考虑代码的扩展性
1.1 准备
$(wildcard _pattern) 获取当前目录中满足 _parttern 的文件和目录列表
$(addprefix _prefix, _names) 给每个名字列表 _names 中的每个名字增加前缀 _prefix
- 自动获取当前目录下的源文件列表(函数调用)
SRCS := $(wildcard *.c) - 根据源文件列表生成目标文件列表(变量的值替换)
OBJS := $(SRCS:.c=.o) - 对每一个目标文件列表加上路径前缀(函数调用)
OBJS := $(addprefix path/, $(OBJS))
1.2 规则中的模式替换(目录结构)

2. 实验
CC := gcc
MKDIR := mkdir
RM := rm -fr
DIR_OF_OBJS := objs
DIR_OF_TARGET := target
DIRS := $(DIR_OF_OBJS) $(DIR_OF_TARGET)
TARGET := $(DIR_OF_TARGET)/hello-makefile.out
SRCS := $(wildcard *.c) # main.c const.c func.c
OBJS := $(SRCS:.c=.o) # main.o const.o func.o
OBJS := $(addprefix $(DIR_OF_OBJS)/, $(OBJS)) # objs/main.o objs/const.o objs/func.o
.PHONY : rebuild clean all
$(TARGET): $(DIRS) $(OBJS)
$(CC) -o $@ $(OBJS)
@echo "Target File ==> $@"
$(DIRS):
$(MKDIR) $@
$(DIR_OF_OBJS)/%.o: %.c
ifeq ($(DEBUG),true)
$(CC) -o $@ -g -c $^
else
$(CC) -o $@ -c $^
endif
rebuild: clean all
all: $(TARGET)
clean:
$(RM) $(DIRS)

320

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



