Makefile - 依赖关系
最后构建得到的二进制文件依赖于各种源代码和头文件是很常见的。依赖关系很重要,因为它们让 make
知道的任何执行目标的依赖。考虑下面的例子 -
hello: main.o factorial.o hello.o
$(CC) main.o factorial.o hello.o -o hello
其中,hello 为 make 的一个目标(target),而 hello 这个目标达成依赖于 main.o,factorial.o 和 hello.o 三个依赖(每个依赖都是另一个目标/文件)。因此,不论哪个依赖的目标发生了变化后, make
都会采取行动来重新(执行命令来)达到目标(即重新执行 $(CC) main.o factorial.o hello.o -o hello
)。
同时,我们需要告诉 make
如何准备 .o 文件(即 hello 依赖的三个目标/文件)。因此我们需要定义这些依赖关系如下 -
main.o: main.cpp functions.h
$(CC) -c main.cpp
factorial.o: factorial.cpp functions.h
$(CC) -c factorial.cpp
hello.o: hello.cpp functions.h
$(CC) -c hello.cpp
以 main.o 为例,在依赖中写上如 functions.h 的意义在于。即使 main.cpp 文件没有修改,但是 functions.h 修改了,那么 $(CC) -c main.cpp
也会重新执行。如果目标依赖的文件都没有修改,那么执行 make
的时候就不会重新去运行其目标下的命令,即不会重复编译已经编译好的代码。