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

相关推荐
热爱编程的小白白3 小时前
【Playwright自动化】录制生成脚本
运维·自动化
java_logo3 小时前
MySQL Server Docker 容器化部署指南
linux·运维·数据库·docker·容器
I***t7163 小时前
自己编译RustDesk,并将自建ID服务器和key信息写入客户端
运维·服务器
誰能久伴不乏3 小时前
Linux文件套接字AF_UNIX
linux·服务器·c语言·c++·unix
BJ_Bonree3 小时前
数智先锋 | 核心应用响应时常<1s、多终端崩溃率低至 0.1%!Bonree ONE 赋能蓝月亮应用性能与终端体验双重升级!
运维
张鱼小丸子3 小时前
电脑刷机教程:轻松重装系统指南
运维
a41324473 小时前
如何解决centos上oracle连接问题
linux·oracle·centos
h***34633 小时前
在linux(Centos)中Mysql的端口修改保姆级教程
linux·mysql·centos
星释3 小时前
Rust 练习册 97:Run-Length Encoding 压缩算法
java·linux·rust
2509_940880223 小时前
Linux(CentOS)安装 MySQL
linux·mysql·centos