make的工作流程:
1.make 会在当前目录下找名字叫“Makefile”或“makefile”的文件。
2.如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会
找到“main”这个文件,并把这个文件作为最终的目标文件。
3.尝试更新Makefile中第一条规则的目标main,第一条规则的目标称为缺省目标,
只要缺省目标更新了就算完成任务了,其它工作都是为这个目的而做的。
4.由于我们是第一次编译,main文件还没生成,显然需要更新,但规则说必须先
更新了main.o、stack.o和maze.o这三个条件,然后才能更新main。
5.查找以这三个条件为目标的规则,这些目标文件也没有生成,也需要更新,所以
执行相应的命令(gcc -c main.c、gcc -c stack.c和gcc -c maze.c)更新它们。
6.最后执行gcc main.o stack.o maze.o -o main更新main。
小结:make 会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make 就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make 根本不理。make 只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。
make如何做到只重新编译修改过的?
1.make仍然尝试更新缺省目标,首先检查目标main是否需要更新,这就要检查三
个条件main.o、stack.o和maze.o是否需要更新。
2.make会进一步查找以这三个条件为目标的规则,然后发现main.o和maze.o需要
更新,因为它们都有一个条件是maze.h,而这个文件的修改时间比main.o和
maze.o晚,所以执行相应的命令更新main.o和maze.o。
3.既然main的三个条件中有两个被更新过了,那么main也需要更新,所以执行命
令gcc main.o stack.o maze.o - o main更新main。