🌟🌟hello,各位读者大大们你们好呀🌟🌟
🚀🚀系列专栏:【Linux的学习】
📝📝本篇内容:make和makefile的背景以及使用和原理
作者简介:轩情吖,请多多指教(> •̀֊•́ ) ̖́-
1.背景
会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。
一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
make是一条命令,makefile(Makefile也可以)是一个文件,两个搭配使用,完成项目自动化构建。
2.使用和原理
大家现在看到上面一个图肯定是蒙的,首先我们要知道make和makefile是一对搭档,他们两要组合使用。
我们先解释一下makefile里面的内容,第一行其实是一对依赖关系,test依赖test.c,可以这样理解,想要生成test就必须要有test.c,下一行是依赖方法,就是他们之间是以什么样的一种方式来依赖的,可以理解为怎么依靠test.c来生成test,这就是普通的一条命令。
其实大家可以借助这个来理解一下依赖关系。
1.在默认模式下,我们输入make命令,make会在当前目录下找名字为“Makefile”或“makefile”的文件。
2.如果找到,它会找文件中第一个目标文件,并把这个文件作为最终的目标文件,也就是上图中test文件
3.如果test文件不存在,或是test所依赖的后面test.o文件的文件修改时间要比test这个文件要新,那么它就会执行后面的所定义的命令(依赖方法)来生成test文件
4.如果test所依赖的test.o文件不存在,那么make会在当前文件中找目标为hello.o文件的依赖性,如果找到则根据他所对应的依赖方法生成hello.o文件
5. make会生成test.o文件,然后再用test.o文件声明make的终极任务,也就是生成test文件的依赖方法。上图中上面的文件
test ,它依赖 test.o
test.o, 它依赖test.s
test.s ,它依赖 test.i
test.i , 它依赖 test.c
6.这就是整个makefile的依赖性,make会一层一层地去找文件的依赖关系,直到最后编译出第一个目标文件
7.在找寻过程中,如果出现错误,那么make就会直接退出,并报错
8.makefile是一个围绕依赖关系和依赖方法构建的一个自动化编译工具
接下来继续解释上面的那个图
首先要注意一下,每个依赖方法前面都是有tab键空出来的,语法就是这样。
在依赖关系中目标文件对应的依赖文件列表可以是空,因此clean它并没有所对应的被依赖文件,clean是用来做项目清理的。
但问题又来了,为什么他不会和第一个目标文件一起执行呢?
因为没有被第一个目标文件直接或间接关联的,那么它后面所定义的命令将不会自动执行。因此想要执行clean时需要输命令make clean来执行
一般我们这种clean的目标文件,我们将它设置为伪目标,用.PHONY来修饰,伪目标的特性是总是被执行。
什么叫总是被执行呢?
见上图,clean被.PHONY修饰后可以一直执行,但test并不是,而是报出is up to date。因为make认为此时的test是最新的,并不需要重新执行,因为在一个很大的项目中,如果文件已经是最新的了还重复执行,会消耗大量的时间。
问题又来了,make是怎么判断是否需要重新执行呢,也就是它怎么判断test是最新的呢?
通过对比时间来进行
前面其实讲过,当test文件不存在,或者test文件所依赖的后面的文件test.c的修改时间要比test这个文件新,那就会重新生成。
使用touch命令可以修改文件修改时间
使用stat可以更加详细地查看修改时间等信息
🌸🌸make、makefile的知识大概就讲到这里啦,博主后续会继续更新更多Linux的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!你们的支持是博主坚持创作的动力!💪💪