Linux基本工具(makefile)

什么是makefile

我们前面的文章介绍了Linux中编译代码的工具——gcc,如果我们编译一个名为code.c的文件,直接在命令行输入gcc code.c,默认形成名为mybin的可执行程序.

我们每编译一个文件,都要输入一遍gcc指令,这样似乎有些麻烦,有没有能自动化构建代码的东西?当然有了,那就是我们今天我们要讨论的Makefile

简单介绍Makefile

首先我们要明确一件事:

make:是一个命令
makefile:是一个在当前目录下存在的一个具有特定格式的文本文件

既然makefile是文件,那我们就touch一个Makefile文件(首字母大不大写都行),然后往里写东西,写东西当然有规则.

比如我想把test.c编译形成mybin文件,那么这么写:

mybin:test.c
	gcc code.c -o mybin

注意,在第二行一定要先打一个tab键.
然后保存退出,直接使用make指令,即可自动编译.
在这里插入图片描述
可以看到,我们输入make后就按照我们的期望完成了编译.
在刚才我们在makefile中输入的两行中,第一行叫依赖关系,第二行称为依赖方法
刚才我们构建了一个文件,如果我想清理呢?
在Makefile文件中继续写入:

.PHONY:clean
clean:
	rm -f mybin

然后输入make clean指令即可完成清理
在这里插入图片描述
注意,make一次形成一个目标文件,make自顶向下扫描makefile文件,碰到第一个目标文件停下.

我们写的.PHONY是啥意思? .PHONY把clean变成伪目标,用.PHONY修饰的文件和其他文件没啥区别,唯一一个重要的特征是它总是被执行的

在不被.PHONY修饰的时候,make和makefile总是不让我们重新编译代码
在这里插入图片描述
可以看到,第二次输入make就编译不了了.这是为啥呢?因为我们源代码没改,没必要重复编译,编译也是一件比较消耗时间的事,makefile会自动帮我们识别,哪些文件改过,哪些文件没改过,提高我们的编译效率.这是怎么做到的呢?

(makefile将源文件的修改时间和bin文件的修改时间进行对比,因为第一次的时候,一定是先有源文件,才有的mybin文件,此时,源文件的修改时间<mybin文件的修改时间。第2/n次的时候,我们对源文件做任何操作,都会让源文件的修改时间>mybin文件的修改时间,此时检测到bin文件已经不是最新的了,此时编译重新形成可执行文件.)

让我们来验证一下

在Linux中,使用stat指令查看文件属性.
在这里插入图片描述
在这里我们能看到三种时间,分别是Access,Modify,Change,其中,Access表示最近读取文件的时间,Modify表示对文件内容修改的时间,Change表示对文件属性修改的时间.

关于这三个时间有点细节需要明确一下

  • 这三个时间并不是独立的,修改一个时间很可能会带来联动修改,比如我只修改Ctime,可能别的time不变,但我修改Mtime,Atime和Ctime都会改变.
  • 关于Atime,并不是每次读取文件都会更改Atime,它是有次数限制的.因为一个文件被查看的频率是非常高的,所有的文件都存在磁盘下,我们更改时间的本质就是访问磁盘,如果没有次数限制,那么Linux系统就会充满大量的访问磁盘的I/O操作,变相的减慢系统效率.
  • 我们前面把源文件和bin文件的修改时间进行比较,比的是Mtime.
  • 我们可以使用touch指令,在不更改文件内容的情况下更新文件的时间,让它变成最新的.
  • 前面说的.PHONY,它下面的依赖方法总会被执行,不会被任何情况拦截.

我们make,makeclean后总会跟着说明,如果想隐藏说明,则可以(加@)

mybin:code.c
	@gcc code.c -o mybin
.PHONY:clean
clean:
	@rm -f mybin

这样后的效果:
在这里插入图片描述
另外,makefile是支持变量的:

cc=gcc
src=code.c
target=mybin

$(target):$(src)
	$(cc) $(src) -o $(target)
.PHONY:clean
clean:
	rm -f $(target)

这样做的好处是方便替换

为了方便,我们可以用 $ ^ 代替依赖关系中:右边的东西(即code.c),用$@代替依赖关系:左边的东西(即mybin)

今天我们主要讨论了makefile的使用,如果文章对您有帮助请点个赞,如果有错误请在评论区指正.

  • 19
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值