GNU Makefile学习专题(三) | 第三个实例
2013-07-18 09:09
218 查看
想实现效果:
在专题(二)的基础上实现:创建每个源文件的依赖关系文件 ,即:.d 文件,从而让 Makefile 聪明地自动发觉什么时候该编译那些文件,而不是每次都编译所有
专题(二)都实现了那些效果,见这儿:点击这儿
简单的源码结构还是和专题(一)中相同,见这儿:点击这儿
直接贴 Makefile 的源码,比专题(二)增加的不多,更新依赖文件那4行代码直接源自于 GNU Make 官方文档(稍加修改),常用函数以及一些知识点的总结见下一篇专题:
生成的几个 .d 文件如下所示:
obj/main/main.d
obj/tools/test_tool_1.d
obj/tools/test_tool_2.d
这儿的 .d 文件中的 .o 都是没有添加路径的,在触发 .c 文件的重编译后 make 怎么去发现这个 .o 文件在哪个路径下呢,不解,求高手。。。。
当 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 文件的重编译, 这个也可以辨识出来。。。。。。
在专题(二)的基础上实现:创建每个源文件的依赖关系文件 ,即:.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 文件在哪个路径下呢,不解,求高手。。。。
当 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学习专题(一) | 第一个实例
- GNU Makefile学习专题(四) | GNU Make 常用内置函数的总结 | 零碎知识点的总结 | (待完善)
- makefile深度学习(一个工程实例来学习 Makefile)
- 一个工程实例来学习 Makefile
- 实例学习写Makefile文件
- 一个工程实例来学习 Makefile
- C语言 makefile学习及实现实例
- Makefile 学习笔记(三)实例
- Makefile学习实例1
- 实例学习编写Makefile
- 操作系统学习笔记(5)--makefile文件实例
- Gnu make手册学习【3】——编写makefile文件
- GNU Makefile学习专题(二) | 第二个实例
- Makefile 文件实例学习
- 【即学即用】——一个工程实例来学习 Makefile
- GNU Make 学习系列一:怎样写一个简单的Makefile
- 一个工程实例来学习 Makefile
- ExtJS 学习专题(一) 如何应用ExtJS(附实例)
- ExtJS 学习专题(一) 如何应用ExtJS(附实例)
- 一个工程实例来学习 Makefile