第10课 - 变量与函数的综合示例
1. 实战需求
(1)自动生成 target 文件夹存放可执行文件
(2)自动生成 objs 文件夹存放编译生成的目标文件(*.o)
(3)支持调试版本的编译选项
(4)考虑代码的扩展性 ——> 使用变量
2. 工具原料
— $(wildcard _pattern)
-
- 获取当前工作目录中满足_pattern的文件或目录列表
— $(addprefix _prefix, _names)
-
- 给名字列表_names中的每一个名字增加前缀_prefix
3. 关键技巧
— 自动获取当前目录下的源文件列表(函数调用)
-
- SRCS := $(wildcard *.c)
— 根据源文件列表生成目标文件列表(变量的值替换)
-
- OBJS := $(SRCS:.c=.o)
— 对每一个目标文件列表加上路径前缀(函数调用)
-
- OBJS := $(addprefix path/, $(OBJS))
4. 规则中的模式替换(目录结构)
— $(OBJS) : %.o : %.c 形式的模式替换对象是$(OBJS)对应的目标列表
— %.o : %.c 形式的模式替换对象是当前工作目录
5. 编译规则的依赖
首先创建 objs 和 target 文件夹分别用来存放 .o 中间文件和可执行程序,然后创建 .o 中间文件和可执行程序,需要在前面添加前缀(放入前面创建的目录中)。
根据$(DIRS) 、 $(OBJS)两个依赖创建文件夹和相应的 .o 文件。后面再由模式匹配生成 .o 文件。
(自上而下的一种委派)
1 # 考虑代码的扩展性 2 CC := gcc 3 MKDIR := mkdir 4 RM := rm -rf 5 6 # 存放可执行程序和中间文件的文件夹 7 DIR_OBJS := objs 8 DIR_TARGET := target 9 10 DIRS := $(DIR_OBJS) $(DIR_TARGET) 11 12 # 可执行程序 13 TARGET := $(DIR_TARGET)/hello-makefile 14 15 # .o中间文件 16 SRCS := $(wildcard *.c) 17 OBJS := $(SRCS:.c=.o) 18 OBJS := $(addprefix $(DIR_OBJS)/, $(OBJS)) 19 20 .PHONY : rebuild clean all 21 22 $(TARGET) : $(DIRS) $(OBJS) 23 $(CC) -o $@ $(OBJS) 24 @echo "Target File ==> $@" 25 26 $(DIRS) : 27 $(MKDIR) $@ 28 29 # 增加debug选项-g 30 $(DIR_OBJS)/%.o : %.c 31 ifeq ($(DEBUG),true) 32 $(CC) -o $@ -c -g $^ 33 else 34 $(CC) -c -o $@ $^ 35 endif 36 37 rebuild : clean all 38 39 all : $(TARGET) 40 41 clean : 42 $(RM) $(DIRS) 43
6. 小结
— 目录可以成为目标的依赖,在规则中创建目录
— 预定义函数是makefile实战时不可或缺的部分
— 规则中的模式匹配可以直接针对目录中的文件
— 可以使用命令行变量编译特殊的目标版本
注:本文整理于《狄泰12月提升计划》课程内容
狄泰QQ群:199546072