Linux -- 认识 make/makefile

目录

前言:

[什么是 make/makefile?](#什么是 make/makefile?)

[怎么使用 make/makefile?](#怎么使用 make/makefile?)

依赖关系和依赖方法:

清理:

[怎么使用 make?](#怎么使用 make?)

[如何编写多文件的 makefile?](#如何编写多文件的 makefile?)

什么是PHNOY?

ACM时间

什么是ACM时间?

[Access 时间:](#Access 时间:)

[Change 时间:](#Change 时间:)

[Modify 时间:](#Modify 时间:)


前言:

想象一下,在一个大工程中,有大量的文件,每个文件中的代码都需要编译,我们每次编译都要写一大段的 gcc 命令,能不能简化这个重复的工作?答案是能。

什么是 make/makefile?

make 是命令,makefile/Makefile (首字母大小写皆可)是文件,makefile一旦写好了,只需要make 命令,整个工程完全自动编译,这两个搭配使用极大提高了软件开发的效率!

怎么使用 make/makefile?

假设我们现在写了一个代码,如下图所示,代码所在文件的文件名为 test.c :

**在使用 make 命令之前,我们必须先写 makefile 文件,**写通了 makefile 之后,make 命令才会顺利运行,否则会报错(如下图所示):

在代码所在的文件夹中touch makefile文件,创建 makefile 文件,之后vim makefile,进入编辑模式:

依赖关系和依赖方法:

在 makefile 文件中,我们需要建立依赖方法和依赖关系

1、mybin:test.c 就是依赖关系,表示 mybin 文件依赖于 test.c,其中 mybin 是目标文件,test.c 是依赖文件列表;

2、gcc test.c -o mybin 就是依赖方法, 此处 mybin 是 test.c 编译后生成的可执行程序。
注意依赖关系和依赖方法的格式,依赖方法前面必须空出 tab 键,这是语法要求!

清理:

除了创建可执行程序外,还可以提供清理可执行程序的方式:

bash 复制代码
clean:
    rm -f mybin

怎么使用 make?

把 makefile 写完之后,输入 make 命令时,就会生成对应的目标文件:

如果文件列表中的文件没有更新,此时 make 命令并不会生成对应的目标文件,会提示目标文件已经更新到最新版本了:

如果我们想清理目标文件,输入 make clean 命令即可!

如何编写多文件的 makefile?

如果项目有很多文件需要编译,此时 makefile 要怎么写更便捷?

首先假设我们此时有很多个文件(如下图所示),把这么多的文件一个个敲进 makefile 文件中是很麻烦的一件事,我们可能会忘记文件名,而导致反复退出 vim 模式去查看:

ls >makefile 可以把 ls 的输出结果重定向到 makefile 中:

bash 复制代码
ls >makefile

此时打开 makefile 就会发现所有的文件都在 makefile 里面了,我们就不需要一个一个地把文件敲进去! 删除不需要的文件名后,就可以进行 makefile 的编写。

@ 表示目标文件,^ 表示依赖文件列表:

写完 makefile 后,此时输入 make 命令时,会自动把我们省略的部分替换成对应的文件:

makefile 中还可以定义变量,make 时会自动替换,下图中若 src 需要定义多个文件,文件之间用空格隔开即可:

什么是PHNOY?

**PHONY 可以修饰目标文件,让目标文件成为一个伪目标,使得 PHONY 后接的命令总是被执行!**我们一般会让 clean 命令总是被执行。

bash 复制代码
.PHONY:clean

ACM时间

上面我们提到,如果目标文件已经是最新的了,那么 make 命令不会更新目标文件,那么 make 怎么知道目标文件已经是最新的呢?这就需要提到ACM时间。

什么是ACM时间?

当我们输入命令 stat filename 时,可以查看文件的状态信息,信息中包含文件的 Access、Modify、Change时间。

Access 时间:

上一次访问、读取文件的时间

当我们用 cat 查看代码时,实际上就是在访问文件了,Access 时间会随之更新!

但不是每一次访问文件都会更新 Access 时间,如果短时间内频繁的访问同一个文件,Access 不会立即更新时间,而是累计到一定次数之后才会更新时间,因为频繁地更新时间,会增加系统的负担!

Change 时间:

上一次修改文件属性的时间(修改文件的大小、权限等)

Modify 时间:

上一次修改文件内容的时间,由于修改文件的内容也会修改文件的属性,所以修改文件的内容时,Change 时间也会随之改变!

当我修改了 test.c 的代码时,文件的 Change时间和 Modify 时间都更新了!

make 是通过对比时间来确定可执行程序是否更新了,那么 make 是根据哪个时间来确定可执行程序需要更新了呢?答案是 Modify 时间。

正常来说,源代码创建的时间比可执行程序早,源代码的 Modify 时间也会比可执行程序的 Modify时间早!

如果我们修改了源代码,那么源代码的 Modify 时间就比可执行程序的 Modify时间晚了, make 通过比较 Modify 时间,就知道源代码更新了,此时就会去更新可执行程序!

本文到这里就i结束了,欢迎各位大佬指正!

相关推荐
卡戎-caryon1 分钟前
【Linux网络与网络编程】12.NAT技术&&内网穿透&&代理服务
linux·运维·服务器·网络·网络协议·https
朱包林5 分钟前
day10-别名-MD5,aide-堡垒机
linux·运维·安全·ubuntu·centos·云计算
好吃的肘子14 分钟前
Zookeeper 入门(二)
linux·分布式·zookeeper
Javis21130 分钟前
【Linux高级全栈开发】2.1.3 http服务器的实现
linux·服务器·http
SunTecTec1 小时前
Linux grep -r 查找依赖包是否存在依赖类 Class
linux·运维·服务器
Johny_Zhao2 小时前
AI+自动化测试系统方案:网络设备与网络应用智能测试
linux·网络·人工智能·python·网络安全·docker·ai·信息安全·云计算·ansible·shell·cisco·huawei·系统运维·itsm·华三·deepseek
Javis2112 小时前
【Linux高级全栈开发】2.1.2 事件驱动reactor的原理与实现
linux·运维·php
FBI HackerHarry浩2 小时前
Linux云计算训练营笔记day10(MySQL数据库)
linux·运维·数据库·笔记·mysql
南暮思鸢2 小时前
vulnhub靶场——secarmy
linux·网络安全·vulnhub靶场·write up·secarmy
YOYO--小天3 小时前
RK3588 ADB使用
linux·嵌入式硬件·adb