- 想实现效果:
- 在专题(二)的基础上实现:创建每个源文件的依赖关系文件 ,即:.d 文件,从而让 Makefile 聪明地自动发觉什么时候该编译那些文件,而不是每次都编译所有
- 专题(二)都实现了那些效果,见这儿:点击这儿
- 简单的源码结构还是和专题(一)中相同,见这儿:点击这儿
- 直接贴 Makefile 的源码,比专题(二)增加的不多,更新依赖文件那4行代码直接源自于 GNU Make 官方文档(稍加修改),常用函数以及一些知识点的总结见下一篇专题:
CC = gcc CFLAGS = -Wall LDFLAGS = -lm INCLUDES = -I src/include SRC_DIR = src/main src/tools OBJ_DIR = obj OBJ_PATH = $(addprefix $(OBJ_DIR)/, $(subst src/,, $(SRC_DIR))) SRC_FILES = $(foreach dir, $(SRC_DIR), $(wildcard $(dir)/*.c)) OBJS = $(subst src,obj, $(SRC_FILES:%.c=%.o)) DEPS = $(OBJS:%.o=%.d) MAKE_OBJ_DIR := $(shell mkdir -p $(OBJ_PATH)) EXECUTABLE = test_makefile all : $(EXECUTABLE) $(EXECUTABLE) : $(OBJS) $(CC) $(LDFLAGS) $(INCLUDES) $(OBJS) -o $(EXECUTABLE) $(OBJS) : $(SRC_FILES) $(CC) $(CFLAGS) $(INCLUDES) -c $(subst obj,src, $(patsubst %.o,%.c, $@)) -o $@ $(DEPS) : $(SRC_FILES) set -e; rm -f $@; \ $(CC) -M $(CFLAGS) $(INCLUDES) $(subst obj,src, $(patsubst %.d,%.c,$@)) > $@.$$$$; \ sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \ rm -f $@.$$$$ -include $(DEPS) clean : -rm -rf ./obj -rm -rf $(EXECUTABLE)
- 生成的几个 .d 文件如下所示:
- obj/main/main.d
- obj/tools/test_tool_1.d
- obj/tools/test_tool_2.d
- 这儿的 .d 文件中的 .o 都是没有添加路径的,在触发 .c 文件的重编译后 make 怎么去发现这个 .o 文件在哪个路径下呢,不解,求高手。。。。
- obj/main/main.d
- 当 make 完毕后,项目及其依赖没有任何变动,run make 命令效果如下所示:
- vim src/include/test_tool_2.h, 添加注释,然后 make,效果如下:
- vim src/include/test_tool_2.h, 修改源代码,然后 make,效果如下:
- vim src/main/main.c,修改源代码,然后 make,效果如下:
- 这个着实令我吃惊了,上面向源文件 src/include/test_tool_2.h 添加了无关、无用的代码 make 并没有触发任何 .c 文件的重编译, 这个也可以辨识出来。。。。。。
GNU Makefile学习专题(三) | 第三个实例
最新推荐文章于 2024-03-05 13:44:04 发布