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结束了,欢迎各位大佬指正!

相关推荐
vickycheung32 小时前
基于RK3588的移动充电机器人应用解决方案
linux·机器人·arm 嵌入式开发
胡西风_foxww3 小时前
Linux下编译安装Nginx
linux·运维·nginx·编译·安装·openssl·pcre
风兮雨露5 小时前
Linux(CentOS 7) yum一键安装mysql8
linux·服务器·mysql
算力魔方AIPC5 小时前
在Ubuntu 24.04 LTS上安装飞桨PaddleX
linux·ubuntu·paddlepaddle
山___5 小时前
Centos 9 安装 PostgreSQL 16 并支持远程访问
linux·运维·centos
weixin_438197385 小时前
k8s服务内容滚动升级以及常用命令介绍
linux·运维·docker·云原生·容器·kubernetes
Linux运维技术栈6 小时前
企业生产环境-麒麟V10(ARM架构)操作系统部署Zookeeper单节点&集群版
linux·运维·zookeeper·架构·arm
萌豚老师6 小时前
右键添加获取可供WSL使用的路径,对windows文件夹也适用,即获取符合Linux规范的路径内容给WSL
linux·windows
van叶~7 小时前
Linux探秘坊-------1.系统核心的低语:基础指令的奥秘解析(1)
linux·服务器