如前所述,make工具会根据所依赖的源文件是否有更新来决定目标文件是否需要重新编译。
如下所示,functions.h
修改了会导致所有目标文件重新编译;而hello.cpp
修改只会导致hello.o hello
重新编译,其他如main.o factorial.o
都不会重新编译。
hello: main.o factorial.o hello.o
$(CC) main.o factorial.o hello.o -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
在编译时,make比较源文件与对应目标文件的时间戳,如果源文件时间戳比目标文件的更新,则认为源文件已更改,将重新生成目标文件。
避免重新编译
- 执行
make -t
命令,可以不重新编译,只是更新目标文件的时间戳,是一个假的编译动作。 make -o 文件
命令,指定文件使用旧文件,作用是指定文件以及它的所有目标项,都不会被重新编译,即使指定的文件或者它的依赖项已经更新。如functions.h
被更新,使用make
命令,functions.h
的所有目标文件都会被重新编译,使用make -o functions.h
,所有它的目标文件不会被重新编译。