首先在Linux下创建两个文件,一个用来完成代码的编写,另一个是makefile(也可以是大写的Makefile)。

在mycode.c中简单的编写一个hello world的代码

在makefile编写依赖关系,和依赖方法

说明:makefile中的第一行表明依赖关系:mycode的可执行程序依赖mycode.c;第二行表明依赖方法:用gcc进行编译mycode.c生成mycode。后面三行是进行项目清理,下面会有介绍,现在可以忽略。
之后我们编译代码就再也不用用gcc mycode.c这样的指令,而是可以直接make,可执行程序mycode就会生成了。

当然我们也可以运行这个可执行程序

如果我们不想要mycode可执行程序,在命令行直接输入make clean即可。

注意: 通过make/Makefile管理的方式,就是Linux下的自动化构建工具。
通过上述例子,细心的同志就会发现如果你连续make生成可执行程序,就会生成一个报错mycode is up to date(mycode 是最新生成的),那么Linux是如何判断mycode是不是最新的呢?

毫无疑问,通过比较两个时间,mycode和mycode.c时间,那怎么查看文件的时间呢?stat + 文件名 用来查看时间。

这里通过比较两个文件Modify时间(后文具体介绍三个时间),来判断是否需要生成最新的mycode可执行程序

这里发现mycode的Modefy时间比mycode.c的文件新,所以不需要生成最新的可执行程序mycode,所以报错mycode is up to date也不难理解了。
Access是最近访问文件的时间,但是由于用户访问文件的次数过多,而且用户对Access的时间需求不大。所以Linux系统优化了这Access的访问时间。可能是访问一定次数更改一次,也可能间隔一定的时间。如果需要准确了解,可能需要源码剖析,有兴趣的同志自行研究。

这里cat访问文件之后,Access的时间并没有进行修改。
这个就很好理解了,当文件属性属性修改的时候,Change的时间也会修改。

举例:把mycode.c中的printf赋值三遍

比较两个Modify时间

毫无疑问,modify的时间变了,但这里其实还有一个问题:
问:为什么在Change的时间也更新的呢?
答:当文件的大小发生改变,那大小算不算文件属性的一部分呢?
我们在Makefile中编写这样的依赖关系和依赖方法

makefile的推导规则类似于stack结构,先进后出。
mycode 依赖于mycode.o
mycode.o 依赖于 mycode.s
mycode.s 依赖于 mycode.i
mycode.i 依赖于 mycode.c
所以先执行那个依赖方法就很明显了后进去的先执行

那么make是如何工作的?


