《Linux篇》自动化构建-make/Makefile

文章目录


在上一篇文章中,我们学习了使用gcc来编译我们的程序,但是那种方式貌似只能编译一个文件,当我们有很多源文件的时候怎么办呢?这时候就需要使用自动化构建make/Makefile了。

0.背景

  1. make是一个Linux系统内置的命令,makefile/Makefile是一个需要工程师自己构建的一个文件。两个搭配使⽤,完成项⽬⾃动化构建。
  2. ⼀个⼯程中的源⽂件不计数,其按类型、功能、模块分别放在若⼲个⽬录中,makefile定义了⼀系列的规则来指定,哪些⽂件需要先编译,哪些⽂件需要后编译,哪些⽂件需要重新编译,甚⾄于进⾏更复杂的功能操作。
  3. makefile带来的好处就是⸺“⾃动化编译”,⼀旦写好,只需要⼀个make命令,整个⼯程完全⾃动编译,极⼤的提⾼了软件开发的效率。
  4. make是⼀个命令⼯具,是⼀个解释makefile中指令的命令⼯具,⼀般来说,大多数的IDE都有这个命令,⽐如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了⼀种在⼯程⽅⾯的编译方法。

1.基本使用

code.c文件:
在这里插入图片描述
我们创建一个Makefile文件,里面的内容如下:
在这里插入图片描述
我们输入make指令就可以编译我们的程序了:
在这里插入图片描述
我们还可以在Makefile里面加入清理的功能:
在这里插入图片描述
输入make clean就可以清理掉了:
在这里插入图片描述
细节:
在这里插入图片描述
在这里插入图片描述
Q1:为什么make一下就默认的是上面的那个gcc,而make clean是下面的rm呢呢?
A1:make默认只形成一个目标,而扫描是从上往下扫描的,如何你上面的两个目标换个顺序,make就是rm和,make code才是gcc。

Q2:什么是伪目标呢?
A2:.PHONY:表示被修饰的目标是一个伪目标 -> 伪目标总是被执行的。什么叫不被执行 -> 如下图,make是不可以多次编译的,他已经是最新的了(Makefile让我们的编译工作尽可能高效一些)。如果我们给code也加上.PHONY,他就是总被执行的了。

最佳实践:可执行程序,不需要修饰为PHONY,clean修饰总是执行的。

Q3:make/makefile怎么知道我要不要重新编译呢?
A3:这就要将其我们之前学过的一个命令了:stat。.c文件和.exe都有modify时间,第一次编译完.exe的modify时间是肯定比.c文件的modify时间新的,如果.c文件一直没有修改,那也就不需要make了,而如果修改了.c文件的内容,那么他的modify时间就更新了,就可以再次make了。
在这里插入图片描述

在这里插入图片描述
一般文件内容(modify)发生改变,文件属性(change)也一定会发生改变。文件属性改变,文件内容不一定会发生改变,比如说我们chmod修改权限,只有change会修改。

Q4:为什么我们修改了文件内容,文件也被打开了,为什么access时间没有改变?
A4:现在Linux为了缓解压力,因为文件访问时间是非常频繁的,现在内核修改为访问文件多次,才会修改这个时间,这个参考意义不大。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其实对于上面完整的make,对应的应该是如下内容:
在这里插入图片描述
在这里插入图片描述
整个流程如下:
在这里插入图片描述
这个过程是make自动推导的,这个过程其实是利用栈数据结构进行推导的:
在这里插入图片描述
完整内容如下:
在这里插入图片描述
但是我们不会这么写,一般情况下,我们都是如下的这种写法,先生成目标文件,再链接·:
在这里插入图片描述
在这里插入图片描述
扩展Makefile,我们只需要修改对应的变量名即可,每个项目都用一套相同的Makefile文件:
在这里插入图片描述
在这里插入图片描述
优化点:
在这里插入图片描述
再进一步优化:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值