当前位置: 首页 > article >正文

【Linux】make和Makefile

目录

  • 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更合理些。

还有一种写法,类似宏替换:
在这里插入图片描述


http://www.kler.cn/news/234311.html

相关文章:

  • Tomcat之虚拟主机
  • 基于微信小程序的校园二手交易平台
  • ChatGPT高效提问—prompt常见用法(续篇九)
  • Nginx实战:2-日志配置
  • wireshark抓包问题及学习
  • Uniapp(uni-app)学习与快速上手教程
  • vue3初识
  • Qt PCL学习(三):点云滤波
  • 2024.2.10 DMS(数据库管理系统)初体验
  • 【知识整理】技术新人的培养计划
  • 关于创建vue项目报错command failed: npm install --loglevel error
  • 蓝桥杯刷题--python-4
  • 4核8G服务器配置性能怎么样?12M带宽配置服务器能干什么?
  • Git详细讲解
  • jsp教材管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
  • .gitlab-ci.yml文件参数配置和使用
  • 电脑空间爆满解决方法
  • c++之说_11|自定义类型 enum(枚举)与enumclass (c11新枚举)
  • Apache网站部署
  • 应用层 HTTP协议(1)
  • 《动手学深度学习(PyTorch版)》笔记8.3
  • 【笔记】Helm-5 Chart模板指南-11 子chart和全局值
  • 学习之旅9------JavaScript面向对象编程(OOP)全面解析
  • 【数据分享】1929-2023年全球站点的逐日降水量数据(Shp\Excel\免费获取)
  • 13.Swift元组
  • C语言第二十二弹---指针(六)
  • LineageOS 线刷包 小米红米 Note 4 (Mido)
  • 从事机器视觉,笔记本电脑该如何选型
  • 基于JSP的网上购书系统
  • Avalonia 虚拟化