[Linux 基础] make、Makefile自动化构建代码工具

文章目录

  • 1、make与Makefile是什么
  • 2、为什么要有make与Makefile
  • 3、怎么实现一个Makefile文件
    • [3.1 如何编写Makefile文件](#3.1 如何编写Makefile文件)
      • [3.1.1 依赖关系](#3.1.1 依赖关系)
      • [3.1.2 依赖方法](#3.1.2 依赖方法)
    • [3.2 如何清理项目](#3.2 如何清理项目)
      • [3.2.1 如何编写](#3.2.1 如何编写)
      • [3.2.2 clean详解](#3.2.2 clean详解)
    • [3.3 make的使用](#3.3 make的使用)
    • [3.4 原理](#3.4 原理)
      • [3.4.1 查看文件修改时间](#3.4.1 查看文件修改时间)

1、make与Makefile是什么

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

2、为什么要有make与Makefile

在VS编译器中,我们在编译执行代码的时候ctrl+f5就可以了,而在linux中我们需要使用gcc/g++ 配合选项并需要正确的格式才可以完成编译,这样是比较麻烦的,我们make与Makefile可以实现自动化构建代码的,当写好代码,只需要一个make指令就能完成整个文件的自动编译。

并且我们写gcc的时候可能会有错误,但是我们直接写到文件中,一次写正确,后面直接使用即可;

我们能够编译,也要能够清理,也是这个道理,我们一次写正确,后面直接使用即可。

3、怎么实现一个Makefile文件

首先我们先创建一个makefile文件,这里makefile单词一定要输入正确,不能出现错误,首字母m可大写可小写,我这里是大写。

bash 复制代码
touch Makefile/makefile //首字母m大写/小写都可以 

3.1 如何编写Makefile文件

Makefile是当前目录下的一个普通文本文件,内容包含依赖关系和依赖方法

首先先进入Makefile文件中,然后输入以下内容

bash 复制代码
test:test.c
    gcc -o test test.c     

注意:我们在输入gcc 指令这一行的时候,必须要tab键。

3.1.1 依赖关系

在上面的Makefile中,test 依赖于 test.c

3.1.2 依赖方法

上面的Makefile中,gcc -o test test.c 就是依赖方法

3.2 如何清理项目

3.2.1 如何编写

首先进入Makefile,输入以下内容

bash 复制代码
.PHONY:clean
clean:
	rm -f test

3.2.2 clean详解

  • 工程是需要被清理的
  • 像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令------"make clean",以此来清除所有的目标文件,以便重编译。
  • 但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的。

3.3 make的使用

当我们已经写好了Makefile文件后,我们直接输入make就可以自动编译代码了。

当我们想要清理可执行文件,我们输入make clean即可。

如果我们在Makefile中先写的是清理,输入make执行的就是清理工作,所以谁在前make就执行谁。


一般我们将清理工作写在构建的后面。

3.4 原理

  1. make会在当前目录下找名字叫"Makefile"或"makefile"的文件。
  2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到"test"这个文件,并把这个文件作为最终的目标文件。
  3. 如果test文件不存在,或是test所依赖的后面的test.c文件的文件修改时间要比test这个文件新(可以用 touch 测试),那么,他就会执行后面所定义的命令来生成test这个文件。
  4. 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
  5. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。
  6. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。

第三点可能会有疑惑,这里的意思其实是,当我们已经生成了可执行文件后,我们对test.c源文件进行修改,这时test.c的内容发生改变,我们再执行make,这时会生成新的可执行程序,如果没有更新内容,那么我们就没有必要再执行依赖方法。

此时就是没有更新源文件,我们再去生成的时候就会报错说test是最新的。

3.4.1 查看文件修改时间

使用stat命令可以查看文件的修改时间。

bash 复制代码
stat 文件名

这里有三个时间,Access、Modify、Change也叫做ACM时间。

Access:读取或进入文件的时间
Modify:最后一次文件内容改变时间
Change:最后一次文件属性改变时间

当我们对源文件内容进行修改之后,Modify时间会随之改变,这时Change时间也可能会改变,因为文件内容的改变会引发属性发生改变(比如文件的大小),所以change时间可能就会随之改变。

make就是根据源文件的修改时间与可执行文件的时间做对比,来选择是否要重新执行依赖方法。

这里我们可以看到源文件修改时间大于可执行文件修改时间,此时执行make,就会重新执行依赖方法,生成新的可执行文件。

这时可执行文件的时间大于源文件时间,再执行make就无效了,我们可以看看:

相关推荐
馨谙11 小时前
SELinux 故障排除完全指南:从拒绝访问到快速修复
linux
群联云防护小杜11 小时前
国产化环境下 Web 应用如何满足等保 2.0?从 Nginx 配置到 AI 防护实战
运维·前端·nginx
凤凰战士芭比Q11 小时前
LNMP环境部署 KodBox私有云盘
linux·架构
suki_lynn11 小时前
Awaken Chaos Era 云手机推荐
运维·服务器
南棱笑笑生12 小时前
20251106给荣品RD-RK3588-MID开发板跑Rockchip的原厂Android13系统时禁止锁屏+永不休眠
linux·运维·服务器·rockchip
远程软件小帮手12 小时前
好用的云电脑!手机怎么用UU远程云电脑玩电脑游戏?
运维·服务器·游戏·电脑
赖small强12 小时前
Linux 优先级反转问题详解与处理方案
linux·优先级反转·优先级继承·缩短临界区
会飞的小蛮猪12 小时前
ELK运维之路(数据备份and还原)
运维·服务器·elk
盛世宏博智慧档案12 小时前
新生产力算力机房内部温湿度之以太网监控系统方案
运维·服务器·网络·算力·温湿度
wdfk_prog12 小时前
[Linux]学习笔记系列 -- [kernel][time]timekeeping
linux·笔记·学习