【参考博客】:
Makefile自动生成头文件依赖_hitwlh的专栏-CSDN博客以makefile编译c工程为例进行解释。在网上搜到的相关教程如下:http://blog.sina.com.cn/s/blog_4b3c1f950102dxh4.htmlhttp://blog.csdn.net/liangkaiming/article/details/6267357http://luzhi1024.blog.51cto.com/8845546/16507https://blog.csdn.net/hitwlh/article/details/53028121【参考书籍】:
《跟我一起学Makefile》
1. 什么是Makefile自动生成头文件依赖也就是说,如果在自己的Makefile中有需要写出头文件的依赖时,可以用上这个知识点,需要注意的是,在GNU的C/C++编译器下,需要使用gcc -MM xxx.c来自动生成头文件依赖关系
2. 原理与方法前一点所说的自动生成头文件依赖的方法是基于C/C++编译器的功能,那么如何将它集成到Makefile中呢?
这里的原理是先把gcc -MM xxx.c生成的依赖关系重定向到一个文件中,利用Makefile的include功能,在Makefile的第一阶段把该文件的内容include到自己的Makefile中即可,这样不仅有了依赖关系,而且Makefile还会根据"隐晦规则",自动推导出生成.o的命令来
3. 验证root@ubuntu:/lianxi/lianxi299# make set -e;rm -rf hello.d;gcc -MM hello.c > hello.d.$$;cp hello.d.$$ hello.d;rm -rf hello.d.$$ gcc -c -o hello.o hello.c gcc hello.o -o hello root@ubuntu:/lianxi/lianxi299#
root@ubuntu:/lianxi/lianxi299# ls hello.c hello.h Makefile root@ubuntu:/lianxi/lianxi299# root@ubuntu:/lianxi/lianxi299# root@ubuntu:/lianxi/lianxi299# root@ubuntu:/lianxi/lianxi299#
1 .PHONY:all clean 2 CC :=gcc 3 AT :=@ 4 TARGET :=hello 5 OBJS :=hello.o 6 INCLUDE:=-I./ 7 8 all:$(TARGET) 9 10 $(TARGET):$(OBJS) 11 $(CC) $^ -o $@ 12 13 #%o:%c 14 # $(CC) $(INCLUDE) -c $^ -o $@ 15 #hello.o: hello.c hello.h 16 -include $(OBJS:.o=.d) 17 18 %.d:%.c 19 set -e;rm -rf $@;$(CC) -MM $^ > $@.$$$$;cp $@.$$$$ $@;rm -rf $@.$$$$ 20 21 clean: 22 -rm *.o *.d $(TARGET)4. 解释
Makefile的执行分成如下两个阶段:
第一阶段:
读入Makefile读入被include的其它Makefile初始化Makefile中的变量推导隐晦规则,并分析所有规则为所有目标创建依赖关系链
第二阶段:
根据依赖关系,决定哪些目标需要生成执行命令
所以在读入Makefile之后就会去执行16行-include hello.d,此时没有该文件,Makefile会尝试生成该文件并继续include它,所以Makefile找到了18行的规则,生成了hello.d并include到当前Makefile中,效果如15行
在接下来的推导隐晦规则中,Makefile会自动推导出生成hello.o的命令来,在第三点中执行的过程已经贴出



