首先什么是make和makefile呢?先简单说,make是一条命令,makefile是一个文件,这个文件中存的是依赖关系和依赖方法,那么为什么会有这两个东西呢?
首先我们知道在VS2019中,我们可以直接创建一个工程,去这个工程里面可以创建多个源文件和头文件,我们要运行代码就直接点按钮就可以了。但是在Linux中每个文件都是独立创建的,它们顶多在一个目录下,但是文件之间无法产生联系,于是我们就可以在此目录下创建一个叫makefile的文件(m也可以大写),它里面存一定的信息表示把一些文件联系起来,就是我们上面所说的依赖关系和依赖方法。创建完文件填好依赖关系和依赖方法退出来使用make这个命令就可以了
那么什么叫依赖关系和依赖方法呢?依赖关系就是为什么用make去帮你执行一些命令,依赖方法是怎么去帮你,下面我用一个最简单的例子来使用一下make和makefile
我们只建一个.c 文件和makefile文件,makefile中写入一下内容
第一行就是我们说的依赖关系,左边是目标文件,右边是依赖文件列表,第二行是依赖方法
然后退出来用make命令就可以生成可执行程序了
当然了,我们只能使用一次make,因为源文件不改重新make也没有用
那么它内部是怎么实现的呢?
我们用stat+文件名可以查看文件的时间信息
我们可以看到有access modify change三个时间
access是最近的访问时间,当我们连续访问文件内容并用stat时,这个access时间是不会变化的,因为我们的访问次数可能会特别多,如果每次都实时刷新的话对系统的负担可能会比较大
modify是文件内容被修改那么这个时间就会刷新
change是文件的属性被修改,那么这个时间就会被刷新
综上所述,我们的make看的是哪个时间呢?就是modify,因为属性被修改并不代表内容被修改(比如说改变权限chmod),而内容被修改才是真的需要重新编译。但是内容被修改属性肯定被修改,因为属性包括文件大小,内容被修改,文件大小就会被修改。
那我们就算没修改内容但还是想让文件重新编译可以用touch+文件名命令,这个命令是没有此文件就创建,有了就刷新modify时间
当然了,我们也可以把makefile中的目标文件设置成伪目标,他就可以让每次使用make都重新编译,只需要加上一句代码
当然只是这么说,我们一般没必要让它每次都编译,就按照系统的来就行,我们一般把clean设置成伪目标,让每次clean都可以执行,clean我们下边会讲
在VS中有清理解决方案,在这里我们也可以设置
我们要使用就用make clean这个命令就可以
也就是说只有第一个产生目标文件使用make,后面都是用make+目标文件
我们这个makefile中也是有一些其他的语法的,比如说替换和定义变量,那么原来的写法就可以写成这样
还有这个文件里边的语法推导过程