https://blog.csdn.net/huao798480517/article/details/8691018
1. 在Makefile中,我们的依赖关系可能会需要包含一系列的头文件,比如,如果我们的main.c中有一句“#include "defs.h"”,那么我们的依赖关系应该是:
main.o : main.c defs.h
如果main.c 中包含了很多头文件,那main.o后面要跟N多的.h。你在加入或删除头文件时,也需要小心地修改Makefile。
2. 类似于如下的依赖关系只是建立了.o和.cc之间的依赖关系,那么.cc 改变时.o 会被重新编译。但.cc 中包含的.h改变时并不会影响到.o的重编。
%.o: %.cc
@echo "=======> Compiling $@"
$(CPP) $(CPPFLAGS) -c -o $@ $<
所以需要建立*.o 和*.h的依赖。但往往*.h非常多,修改起来麻烦。
3. 大多数的C/C++编译器都支持一个“-M”的选项,即自动找寻源文件中包含的头文件,并生成一个依赖关系。例如,如果我们执行下面的命令:
cc -M main.c 其输出是:
main.o : main.c defs.h
于是由编译器自动生成的依赖关系,这样一来,你就不必再手动书写若干文件的依赖关系,而由编译器自动生成了。需要提醒一句的是,如果你使用GNU的C/C++编译器,你得用“-MM”参数,不然,“-M”参数会把一些标准库的头文件也包含进来。
cc -MM UartDev.cc 会在UartDev.d中生成如下内容。
UartDev.o UartDev.d: UartDev.cc ../../common/log.h UartDev.h ../../common/thread.h
从而,当某个.h 文件改变时会引起.o .d的重新编译。
当然还要在Makefile中包含.d文件:
DEPS+= $(SRCS:.cc=.d)
include $(DEPS)