Linux -- 认识 make/makefile

发布于:2024-07-11 ⋅ 阅读:(6) ⋅ 点赞:(0)

目录

前言:

什么是 make/makefile?

怎么使用 make/makefile?

依赖关系和依赖方法: 

清理: 

怎么使用 make? 

如何编写多文件的 makefile? 

什么是PHNOY?

ACM时间

什么是ACM时间? 

Access 时间:

Change 时间:

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 键,这是语法要求! 

清理: 

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

clean:
    rm -f mybin

怎么使用 make? 

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

 

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

 

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

 

如何编写多文件的 makefile? 

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

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

 

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

ls >makefile

  

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

 

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

 

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

 

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

 

 

什么是PHNOY?

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

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


网站公告

今日签到

点亮在社区的每一天
去签到