所属专栏:Linux学习❤️
>博主首页:初阳785❤️
>代码托管:chuyang785❤️
>感谢大家的支持,您的点赞和关注是对我最大的支持!!!❤️
>博主也会更加的努力,创作出更优质的博文!!❤️
“自动化编译”
,一旦写好,只需要一个make命令,整个工程完全自动编make是一个命令工具
,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命make是一条命令,makefile是一个文件
,两个搭配使用,完成项目自动化构建。只有当你对原先代码进行了修改之后才能再次使用make
。原因是在对一个没有进行修改的代码,在执行make指令的时候make会进行判断,判断你的代码是否修改过,如果修改过了则可以使用make指令进行编译,但是如果没有的话,make就会认为既然没有修改过执行后的结果也是跟上一次一样,也就没有必要在进行编译,于是make就会中断,直接跳出提示信息。默认是从上到下扫描makefile文件,默认是形成第一个文件。
先说结论,后验证。
make/makefile是通过文件的修改时间来判断的
。说到时间,在我们之前学习文件的时候,我们说过了每一个文件都对应着有三个时间,修改时间(modify),改动时间(change),访问时间(access)
。
首先我们先搞明白先后顺序,是先有文件呢?还是先有可执行文件呢?
肯定是现有文件,然后通过编译才有的可执行文件。所以一般可执行文件的修改时间是比文件的时间要最新的
,所以make是通过判断谁的时间更新来进行判断要不要在进行编译的。
如果可执行文件的时间最新,那么就说明原先的文件没有别修改过,所以make就不会进行编译。如果是文件的时间最新就说明文件被修改过,那么make指令就会被执行。
修改时间(modify)
说到时间上面的时间有两个看似是一样的,修改时间(modify)和改动时间(change),但是其实不是。
我们讲文件的时候提到,文件=内容+属性
,当文件内容改动的时候则修改时间(modify)就会更新,如果时属性发生改变了则改动时间(change)会进行更新。
那么这里为什么只是修改了文件的内容而修改时间(modify),和改动时间(change)都改变了呢?
我们要知道属性不仅包括了文件的创建时间,文件名等,还包括了文件大小,在修改文件内容的时候文件大小也随着改变,进而属性也发生了改变。
改动时间(change)
我们可以改变一下文件的权限,权限也属于文件的属性内容。
从这里就可以验证,当属性被修改后,改动时间(change)则会进行更新。
访问时间(access)
当对文件进行访问的时候,访问时间会进行更新。
细心的小伙伴可能会发现,当多次访问同一个文件的时候,不是每次访问(access)时间都会实时更新,而是过了一段时间后再次访问后才会进行更新。这是因为,时间也是文件的属性,我们要对文件属性进行修改就要到文件所在的磁盘底下对数据进行修改,而访问文件时修改文件,改动属性这三者当中占比最多的一个。如果我们每次访问文件都对文件的访问时间(access)进行实时更新的话,那也就是说在系统当中相当一大部分时间都只在对文件的属性进行更新,而且还是实时更新的,那个假设有多个文件同时访问呢?这务必会对系统的一些效率会产生一定的影响,所以设计者就规定,只有在访问后的一段时间,或者访问到一定的次数之后我们的访问时间才会进行更新。
通过文件的修改时间进行判断是否要进行编译
,那么也就说我们是不是每次我们要执行make的时候都要去对我问文件进行修改后才能能运行呢?touch除了可以创建一个文件外,还可以对一个已成创建的文件进行刷新修改时间(modify)
.PHONY
"修饰后的目标文件成为一个伪目标
,修饰后的结果——总是可以被执行。
-f选项,强制删除。
在我们的makefile文件中,我们的依赖方法中,其实可以不要直接出现目标文件和原文件,因为我们的make/makefile本来就可自动的识别我们的目标文件和原文件。
“$@”来表示目标文件,
“$^表示原文件
预处理,编译,汇编,和链接构成的
,所有它们的依赖关系和依赖方法应该也是由四个的
。上面的文件 mytext,它依赖 text.o
text.o , 它依赖 text.s
text.s , 它依赖 text.i
text.i , 它依赖 text.c