makefile通过生成.d文件,自动加载.h文件
obj_cpp:=$(wildcard *.cpp)
obj:=$(patsubst %.cpp,%.o, $(obj_cpp))
obj_d:=$(patsubst %.cpp,%.d, $(obj_cpp))
CC=gcc
.PHONY : main
main : main.a
main.a : $(obj)
$(CC) -o main.a $(obj) -lstdc++
include $(obj_d)
%.d : %.cpp
@set -e;rm -f $@;\
$(CC) -MM $< > $@.$$$$;\
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@;\
rm -f $@.$$$$
.PHONY : rebuild
rebuild: clean main
.PHONY : clean
clean:
-rm *.o *.a *.d *.d*
- makefile预编译会解析include命令,加载对应文件,文件不存在则在代码行生成(如果可以),%.d : %.cpp命令可以生成对应.d文件。
- sed命令是将main.o : … 替换成main.o main.d : …,因为第一次生成d文件后之后的include将不再执行**%.d : %.cpp**命令;如果不替换,之后的d文件将不再改变,头文件有增减,将出现问题;替换后目标d文件将会依赖源文件,当源文件改变,每次include会自动更新d文件;
- make在执行过程中include的文件发生改变会重新执行make命令,include d文件后如果对d文件进行了修改,会重新进行include,直到没有文件发生变化。