目录
1、makefile基本规则
2、makefile执行过程
3、makefile的运行规则
1、makefile基本规则
(1)命名:makefile 和 Makefile
(2)makefile文件:里面是多个命令的集合,使用make命令执行该文件
(3)命令的语法规则(以gcc为例):
目标:依赖条件 (一个tab的缩进)命令
hello:hello.c gcc hello.c -o hello
2、makefile执行过程
以gcc编译hello.c为例
(1)在文件夹下创建makefile文件
(2)创建并编写hello.c文件输出helloworld
(4)按照语法规则编写makefile文件
(4)在该文件夹下运行make命令
可以看到make命令将makefile中的命令执行,并生成了对应的目标,如果makefile里面有多个命令,就会全部执行,而这就是makefile的作用。
3、makefile的运行规则
(1)若想生成目标,检查规则中的依赖条件是否存在,如果不存在,则寻找是否有规则用来生成该依赖文件。(依旧以gcc为例,将gcc编译成执行文件的过程分为两步)
hello:hello.o gcc hello.o -o hello hello.o:hello.c gcc -c hello.c -o hello.o
这次代码将gcc编译分成了两个阶段,执行make命令后,在执行第一个命令的时候会发现文件夹中没有hello.o此时就会寻找makefile文件的命令集中是否存在命令可以生成该文件,便会先运行第二个命令,然后再执行第一个命令。
(2)检查规则中的目标是否需要更新,必须先检查它的所有依赖,如果有任意一个依赖需要更新,则目标必须更新。
注意:在gcc的四个过程中,编译的过程是最耗时的,所以一般情况下会在makefile中将依赖文件按模块区分,将各模块编译成.o文件,最后通过链接完成编译,这样某一个依赖更新时,其他未更新的文件就不会发生因为重新编译而浪费资源的问题。
判断机制:执行make命令时,会判断文件的最后一次更新时间,如果依赖文件的时间比目标文件晚,说明依赖文件发生了更新,那么该命令需要重新执行,反之该命令就会认为已经执行且未发生更新,就不会产生不必要的命令执行。当然,如果目标文件不存在肯定会执行该命令。
(3)makefile默认将第一个命令作为最终目标,完成目标后就会停止运行,所以一般情况下会将需要生成的最终目标文件放在第一个命令。
还有一个办法就是最makefile文件的第一个命令使用(ALL:最终目标文件)
这样makefile的最终目标就是你指定的这个文件。