【Linux】make和Makefile

目录

make和Makefile

我们使用vim编辑器的时候,在一个文件里写完代码要进行编译,要自己输入编译的指令。有没有一种可以进行自动化编译的方法------makefile文件,它可以指定具体的编译操作,写好makefile文件,只要一个make指令,就能够对源文件进行自动化编译。

makefile与Makefile两种写法都可以

makefile是文件,make是指令

先创建一个makefile文件,然后进行编写

目标文件与依赖文件列表组成依赖关系,依赖方法是具有要执行的操作。依赖文件列表可以不止一个文件。

保存退出,make指令完成编译工作,mybin就是可执行程序

当再次输入make指令时,会出现以下提示

提示说明该可执行程序是最新的,不能再编译了。只要可执行程序的最近修改时间比源文件的最近修改时间要来的新,那么该可执行程序就是最新的,此时make就会出现以上状况。

有两种方法可以让可执行程序的时间不是最新:

1️⃣修改源文件的内容:

2️⃣清理可执行程序:


这里可能有些小疑惑,为什么最上行的mybin只用make就可以执行,clean要输入make clean才行?因为makefile和make形成目标文件的时候,默认是从上到下,默认第一个是目标文件,且只有一个。也就是说mybin是目标文件,直接make执行的就是它。这里输入make mybin与make的效果是一样的,但是下面的clean只能输入make clean。

makefile文件里mybin和clean是可以互换位置的,即clean在最上行,mybin在下行,输入make执行的是clean,要执行mbin输入make mybin。

尽管可以调换位置,但还是以前面的写法为主较好。

前面说可执行程序能否再次编译,与它的最近修改时间有关。如果它的最近修改时间比源文件的最近修改时间要新,那么就不能编译;否则可以编译。那到底为什么会这样呢?这与文件的三个时间有关。

先来介绍一下文件的三个时间:

Access是访问时间,即查看该文件的内容的时间;

Modify是文件内容的修改时间;

Change是文件属性的改变时间。

文件=内容+属性

下面来验证下:

我们发现Modify时间改变了,但是Change时间也改变了。因为修改文件的内容,文件的大小也发生了变化,文件大小也是文件属性,即文件属性变化了,所以修改文件内容会连同文件属性一并修改。

前面修改文件内容或者文件属性会改变Modify或者Change,但是这里访问文件内容Access时间没有发生变化。因为这3个时间里,相对而言访问的次数比修改更加频繁,即操作的时候我们一般都是查看文件较多,修改相对较少,所以系统就设定了一个规则,在短时间内查看文件它的Access时间不会发生改变,这么做其实也起到一个保护作用,因为前面说了,查看文件的操作的频次较高,如果系统频繁给Access时间调整,这样对系统来说比较"累",所以这个Access时间在过了一定的时间段才发生改变。

touch指令是创建一个普通文件,如果该文件已存在,那么就会刷新该文件的3个时间,同时也能够重新进行编译。

但是每次都用touch刷新并不是很好,所以这里介绍一个语法:

.PHONY的作用是修饰mybin目标文件,成为一个伪目标,可以总是被执行。

此时多次用make它总是能被执行。

通常来说 .PHONY 修饰clean更好些

因为清理操作就应该总是被执行的。而且还有一点,如果用来修饰mybin,它就可以总是被执行,前面已经验证过了,但是如果总是被执行,我们就不能够知道可执行程序和源文件的最近修改时间谁是新的谁是旧的,因此,修饰clean更合理些。

还有一种写法,类似宏替换:

相关推荐
Bruce_Liuxiaowei8 分钟前
Netstat高级分析工具:Windows与Linux双系统兼容的精准筛查利器
linux·运维·网络·windows·安全
yt9483212 分钟前
C#实现CAN通讯接口
java·linux·前端
卷到起飞的数分15 分钟前
Java零基础笔记07(Java编程核心:面向对象编程 {类,static关键字})
java·开发语言·笔记
YOLO大师25 分钟前
华为OD机试 2025B卷 - 小明减肥(C++&Python&JAVA&JS&C语言)
c++·python·华为od·华为od机试·华为od2025b卷·华为机试2025b卷·华为od机试2025b卷
谁他个天昏地暗26 分钟前
Java 实现 Excel 文件对比与数据填充
java·开发语言·excel
linux修理工29 分钟前
n1 armbian 安装桌面环境并启用xrdp远程登录
linux·服务器·数据库
kaikaile199542 分钟前
使用Python进行数据可视化的初学者指南
开发语言·python·信息可视化
大P哥阿豪43 分钟前
Go defer(二):从汇编的角度理解延迟调用的实现
开发语言·汇编·后端·golang
花小璇学linux1 小时前
imx6ull-裸机学习实验1——汇编LED灯实验
linux·汇编·imx6ull·arm裸机开发
意疏1 小时前
【Python篇】PyCharm 安装与基础配置指南
开发语言·python·pycharm