[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就无效了,我们可以看看:

相关推荐
6v6-博客2 小时前
P2P 远程桌面工具|免费开源内网穿透远程软件
运维·服务器
deeper_wind2 小时前
k8s-容器化部署论坛和商城服务(小白的“升级打怪”成长之路)
linux·运维·容器·kubernetes
勇往直前plus2 小时前
VMware centos磁盘容量扩容教程
linux·运维·centos
政安晨3 小时前
Ubuntu 服务器无法 ping 通网站域名的问题解决备忘 ——通常与网络配置有关(DNS解析)
linux·运维·服务器·ubuntu·ping·esp32编译服务器·dns域名解析
007php0074 小时前
Jenkins+docker 微服务实现自动化部署安装和部署过程
运维·数据库·git·docker·微服务·自动化·jenkins
路溪非溪5 小时前
嵌入式Linux驱动开发杂项总结
linux·运维·驱动开发
2501_920047035 小时前
nginx-限速-限制并发连接数-限制请求数
运维·nginx
Neolock5 小时前
Linux应急响应一般思路(三)
linux·web安全·应急响应
网硕互联的小客服6 小时前
服务器支持IPv6吗?如何让服务器支持IPv6
运维·服务器·ip
被遗忘的旋律.6 小时前
Linux驱动开发笔记(七)——并发与竞争(上)——原子操作
linux·驱动开发·笔记