【Linux】Linux项目自动化构建工具 --- make / makefile

在这里插入图片描述

👦个人主页:Weraphael
✍🏻作者简介:目前正在学习c++Linux还有算法
✈️专栏:Linux
🐋 希望大家多多支持,咱一起进步!😁
如果文章有啥瑕疵,希望大佬指点一二
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注😍


一、为什么要使用make

先来想象一个案例,假设一个执行文件里面包含了5个源代码文件,分别是main.cadd.csub.cdiv.cmul.c,这5个文件的目的是:

  • main.c:让用户输入两个操作数和一个操作符,再调用其他4个子程序。

在这里插入图片描述

  • Add.c:计算两数之和。

在这里插入图片描述

  • Sub.c:计算两数之差。

在这里插入图片描述

  • Div.c:计算两数之商。

在这里插入图片描述

  • Mul.c:计算两数之积。

在这里插入图片描述

接下来让以上使用gcc编译代码,生成一个可执行文件test.exe

在这里插入图片描述

我们发现一个特点:gcc同时编译多个源文件的时候写的很长。而且如果某个模块修改了,还得要重新编译,那么还要写这么长的命令就显得非常麻烦。如果可以的话,能不能有一个步骤完成上面的所有操作?

那就使用 make指令和makefile文件

首先先带大家见见猪跑,后面再教大家怎么写。

在这里插入图片描述

通过以上样例,我们发现仅仅通过make指令就生成了可执行文件,真的非常方便。

另外,如果我们修改某些源代码文件,则make也可以更新该执行文件test.exe;如果没有修改源代码,那么执行makie就不会重新编译,如此一来,节省了很多编译的时间。

在这里插入图片描述

要知道,某些程序在进行编译的操作时,会消耗很多CPU资源。所以说make有以下这些好处:

  • 简化编译时所需要执行的命令

  • 如果修改了某个源文件,则make仅会针对被修改的文件进行重新编译来更新执行文件。

make里面最需要注意的大概就是文件makefile,所以接下来我们就针对makefile的语法来加以介绍。

二、makefile的基本语法

这里要区分两个概念:

  • make是一个命令行工具,用于执行makefile中定义的规则,自动化地构建和管理项目。
  • makefile是一个普通的文本文件,其中包含了项目的构建的依赖关系和依赖方法,以及构建过程中使用的命令。 另外,在创建makefile文件时,开头也可以大写。

以下主要介绍makefile的写法:

makefile 文件中主要编写任务,而任务由 依赖关系 + 依赖方法 构成

因此,基本的makefiile语法是这样的:

target: dependencies
<Tab>  命令
  • target:是要生成的文件名,可以是可执行文件、目标文件或者任何其他文件。
  • dependencies:是生成 target 所需要的文件(依赖文件)。
  • command: 是生成 target 的命令

三、make指令

  • 单纯输入make指令时,默认执行makefile中的第一个任务,当任务成功执行后,不再继续执行后续任务。

在这里插入图片描述

通常情况下,makefile文件中会将编译代码的任务放在文件的顶部或者作为默认目标。这是因为编译代码是构建项目的核心任务之一,放在文件的顶部可以让开发者更容易找到和执行。

  • 也可以指定执行任务
make target

在这里插入图片描述

四、 清理项目文件

大家有没有发现,如果make一下发现临时文件变多了,比如以下情况:

在这里插入图片描述

那能不能也通过执行一个命令就直接删除所有的目标文件和执行文件呢?答案是当然可以!

# clean可以随便取
clean:  # 不需要依赖任何文件
	rm -rf [要删除的文件]

在这里插入图片描述

接下来看看执行后的结果

在这里插入图片描述

五、 PHONY关键字

在这里插入图片描述

我们在开始就发现,当我们连续的make的时候,会提示我们文件已经是最新的。这是为什么呢?

这其实是因为make在执行有关编译代码的任务时,如果源代码没有被修改过,那么就不会执行编译了,因为重复对一个没有修改的源代码进行编译本身就没必要。其目的就是为了提高编译效率。

那是如何做到的呢?

首先大家得明白一个概念,可执行文件的时间不可能会等于源文件的时间。因为必须要先有源文件才能够有可执行文件。因此,源文件的创建时间一定早于可执行文件的创建时间

那么,系统只需要对比源文件最近修改时间和可执行文件的时间,就可以判定是否重新编译。

  • 如果源文件的时间晚于可执行文件的时间。说明源文件被修改过了,因此就需要重新编译

  • 如果源文件的时间早于可执行文件的时间。说明源文件没被修改过了,因此就不需要重新编译

因此,这里有一条指令能帮助我们查看文件的时间

stat [filename]

在这里插入图片描述

  • Access:最近一次访问文件的时间
  • Modify:最近一次修改文本的时间
  • Change:最近一次改变文件属性(大小、权限等)的时间。

那么有没有什么办法可以重复执行呢?答案当然是有的!

.PHONY是一个特殊的目标,用于声明一个伪目标,这样就能在不对源文件进行修改的情况下,重复执行任务了。

makefile中,声明.PHONY的语法格式如下:

.PHONY: target1 target2 ...

其中,target1target2是伪目标的名称,可以有多个,用空格分隔。声明.PHONY后,make将不会检查这些目标的时间戳,而是始终执行相应的命令。

在这里插入图片描述

然后我们再重复执行make指令看看效果

在这里插入图片描述

但是需要注意的是:以上对源文件的做法是没有意义的。一直重复执行没有修改的源文件不是白费力气吗?

因此,.PHONY 这个关键字,一般是用来修饰 clean 任务,即清理解决方案

在这里插入图片描述

六、 makefile中的特殊符号

makefile中有两个特殊符号

  • $@ - 表示冒号左边的对象
  • $^ - 表示冒号右边的对象

在这里插入图片描述

再来看看效果

在这里插入图片描述

不过我们也会发现我们上面的使用make的操作会使得这些命令回显出来

  • 如果我们不想要将命令回显出来,可以在依赖方法前加上@

在这里插入图片描述

再来看看效果

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值