1. 需求分析
- 工程项目中不希望源码文件夹在编译时被改动 ( 只读文件夹 )
- 在编译时自动创建文件夹 ( build ) 用于存放编译结果
- 编译过程中能够自动搜索需要的文件
- makefile 易于扩展,能够复用相同类型的项目
- 支持调试版本的编译选项
2. 项目类型分析
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/2205193a07d58fd0ba3abbeb6b4f0ac6.png#pic_center)
3. 需要使用的预定义函数
$(wildcare $(DIR)/_pattern)
用于获取 $(DIR) 文件夹中满足_pattern 的文件$(notdir _names)
用于去除 _names 中每一个文件名的路径前缀$(patsubst _pattern,replacement,_text)
用于将_text 中符合 _
pattern 的部分替换为 replacement
4. 示例Demo
.PHONY : all clean
DIR_BUILD := build
DIR_SRC := src
DIR_INC := inc
TYPE_INC := .h
TYPE_SRC := .c
TYPE_OBJ := .o
CC := gcc
LFLAGS :=
CFLAGS := -I $(DIR_INC)
ifeq ($(DEBUG),true)
CFLAGS += -g
endif
MKDIR := mkdir
RM := rm -fr
APP := $(DIR_BUILD)/app.out
HDRS := $(wildcard $(DIR_INC)/*$(TYPE_INC))
HDRS := $(notdir $(HDRS))
OBJS := $(wildcard $(DIR_SRC)/*$(TYPE_SRC))
OBJS := $(OBJS:$(TYPE_SRC)=$(TYPE_OBJ))
OBJS := $(patsubst $(DIR_SRC)/%, $(DIR_BUILD)/%, $(OBJS))
vpath %$(TYPE_INC) $(DIR_INC)
vpath %$(TYPE_SRC) $(DIR_SRC)
all : $(DIR_BUILD) $(APP)
@echo "Target File ==> $(APP)"
$(DIR_BUILD) :
$(MKDIR) $@
$(APP) : $(OBJS)
$(CC) $(LFLAGS) -o $@ $^
$(DIR_BUILD)/%$(TYPE_OBJ) : %$(TYPE_SRC) $(HDRS)
$(CC) $(CFLAGS) -o $@ -c $<
clean :
$(RM) $(DIR_BUILD)
5. 总结
- 工程项目中不希望源码文件在编译时被改动
- 模式规则的灵活运用使得 makefile 具有复用性
- 变量的灵活运用使得 makefile 具有扩展性
- 规模较小的项目没必要使用自动生成依赖关系的解决方案
- 规则较小的项目可以直接让源码文件依赖于头文件 ( 易于维护 )