1.背景
如果在vs中写程序的时候,有100个源文件,那么我们是要把每个.c文件或者.cpp文件经过预处理,编译,汇编编译成.o文件 ,然后再把这些.o文件链接起来,生成1个或者多个可执行程序。那么这些事情是编译器帮我们做的,那么在linux中就需要我们手动去做了,在linux中自动化构建项目的工具就是make/makefile。
2.理解
那么make是什么呢?makefile又是什么呢?
make是一个命令,makefile是一个文件。make是系统为我们提供的一个命令,而makefile是需要用户在当前工作目录下自己写的一个文件。makefile是保存依赖关系和目标的一个东西。
3.依赖关系
如果我们要编译一个mytest.c的文件,首先我们要创建一个名为makefile的文件,名字必须是Makefile/makefile,那么第一行需要我们写上我们需要创建的可执行程序的名称以及这个目标文件所需要的依赖文件名称,在下面这个例子中我们想创建一个名为mytest的可执行程序,那么我需要一个名叫mytest.c的源文件,这就是依赖关系。
4.依赖方法
第二行就是依赖方法,使用gcc编译mytest.c这个源文件,生成一个名叫mytest.c的目标文件,这一步骤可以参考我的这一篇博客http://t.csdnimg.cn/yAdih
那么这两步就是依赖关系和依赖方法。
然后我们退出之后,在命令行使用make这个命令,会自动进行编译,生成mytest这个可执行程序。
5.原理
make是如何工作的,在默认的方式下,也就是我们只输入make命令。那么,
6.项目清理
那么我们就需要在makefile里面定义一个clean,它的依赖关系为空,因为不需要依赖任何文件,依赖方法如下,也就是删除mytest这个临时文件,-f的意思是强制删除,就不会询问了。
在命令行中使用make clean这个命令就可以删掉了.
需要注意的是在写完makefile之后,使用make这个命令默认执行的是第一行的代码,因为是从上到下扫描makefile这个文件的,如果我们把clean写在第一行,那么make就是删除命令,想执行gcc编译命令,那么就需要make mytest才行。并且make命令默认只执行一个依赖方法。
大家注意看,当我们已经形成可执行程序mytest后,如果再次使用make命令,那么系统会提示我们当前文件已经是最新的了。那么make/makefile是如何直到可执行程序是最新的呢?其实是通过对比时间来确定的,只要可执行程序的最新修改时间比源文件的修改时间新,就说明它是最新的。
7.文件时间
使用stat这个指令就能看到一个文件的三个时间,modify是修改的时间,change是改变的时间,当我们再次在mytest.c这个文件中写入内容是,我们会发现,modify和change都会改变,这是为什么呢?此时我们要知道的是文件=内容+属性,modify是内容的修改时间,change是属性的修改时间,那么属性包括文件的大小,拥有者,所属组.....其实ll这条指令查看到的所有内容都是文件的属性,那么为什么改变内容会导致change发生改变呢?因为内容的改变会导致文件的大小发生变化,那么就意味着属性发生了改变。
结论:通常内容和属性是一起改变的,而属性是单独改变的。
那么access是文件的访问时间,当我们使用cat命令的时候,就会修改access的时间,但是当我们短时间内多次的访问一个文件的话,它的access是不会一直改变的。
那么想知道一个可执行程序是否是最新的,对比源文件和可执行程序的时间是哪个时间呢?对比的时间其实是modify的时间,因为主要是内容的更新。
今天的分享到这里就结束了,感谢大家的阅读!