前言:
- 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
- makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
- make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
- make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
可以说会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。
首先要理解Makefile是什么
make是一条命令,makefile是一个文件,两个需要搭配使用。
基本概念
依赖关系和依赖方法
依赖关系也就是 a : b a 继承 b 通过 依赖方法 这种方式;
如果 b 是空, 那么就是 a 继承了空 a依赖于空,照样可以进行依赖方式的指令。
当然,Makefile没有这么简单,我们需要继续完善它;
Make file的完善
先看这个Makefile
- 为什么make 执行 gcc?
- make clean 执行 rm ?
首先是因为Makefile是从上向下执行的,类似于栈的结构若遇到无法执行的继承,就会放入栈内,直到遇到一个可以执行的;先执行这个,然后依次从栈里取出之前放入的继承,进行执行;若这个过程中还是有不可以执行的,那就报错;
遇到一个可以执行的后,后面的就是伪目标了,需要自己输入执行;
若练习过就可以知道;
为什么make只能执行一次?make clean可以执行多次?
注意下面这个被成为伪目标( .PHONY:),伪目标总是被被执行的;
对应的依赖关系和方法,也就是下面写的,唯一不太一样的就是clean 依赖 空
默认下,Makefile的目标都是 不被执行的。
也就是源代码不更新,就不会重新编译,这样也大大增加了编译的效率。
什么是不被执行:
- 默认老代码不做重新编译;
make是怎么知道是不是老代码的呢?
modify时间!
- 只改变内容,Modify改变
- 只改变属性,change改变
- 只查看内容。access改变
但是一般情况下,内容也是属性的一部分,只要内容改变了,属性也会跟着改变;
查看为什么特殊呢?
因为我们编译代码时,百分之八九十都要查看文化;因此查看的时间属性会实时更新,这样态频繁了;后来,修复了这个bug,查看几次,文件才会改变查看时间(具体要根据不同的系统而定。
.PHONY
因此根据上面的内容可以知道:
.PHONY的作用就是,忽略时间对比的新旧。
可读性?,更简便的自动化。
先看这个代码和输出
加上符号代替所有内容都手打,是不是更容易,更简洁了;
但是输出我们发现,还是把指令输出出来了,这样可读性不好。那该怎么办?
这样,就极大的增加了可读性,于代码的简洁行;
大多数Makefile也是这样写的
多个文件怎么办?
总不能 .o .i .s 一个一个打出来吧,那多麻烦;
这里就不得不提一个符号了。