Linux make 检查依赖文件更新的原理

1. 文件的时间戳

make 主要依靠文件的时间戳来判断依赖文件是否有更新。每个文件在文件系统中都有一个时间戳,记录了文件的三种重要时间:

  • ​访问时间(Accesstime)​​:文件最后一次被访问的时间。
  • ​修改时间(Modifytime)​​:文件内容最后一次被修改的时间。
  • ​状态改变时间(Changetime)​​:文件的状态(如权限、所有者等)最后一次被修改的时间。

make 主要关注的是文件的修改时间(mtime)。

2. 比较时间戳的过程

当 make 读取 makefile 中的规则时,会按照以下步骤检查依赖文件是否有更新:

步骤一:确定目标和依赖文件

假设 makefile 中有这样一个规则:

main: main.o add.o sub.ogcc main.o add.o sub.o -o main

这里 main 是目标文件,main.oadd.o 和 sub.o 是依赖文件。

步骤二:检查目标文件是否存在
  • 如果目标文件 main 不存在,那么 make 会认为目标文件是最新的(因为还没有生成),需要执行规则中的命令来生成目标文件。
  • 如果目标文件 main 存在,继续下一步。
步骤三:比较目标文件和依赖文件的修改时间
  • make 会获取目标文件 main 的修改时间(mtime)。
  • 然后依次获取每个依赖文件(main.oadd.o 和 sub.o)的修改时间。
步骤四:判断是否需要重新生成目标文件
  • 如果任何一个依赖文件的修改时间比目标文件的修改时间新,说明依赖文件有更新,make 会执行规则中的命令来重新生成目标文件。
  • 如果所有依赖文件的修改时间都不比目标文件的修改时间新,说明目标文件已经是最新的,make 不会执行任何命令。
3. 示例说明

假设当前目录下有以下文件及其修改时间:

  • main:2025-04-04 10:00:00
  • main.o:2025-04-04 09:00:00
  • add.o:2025-04-04 9:30:00
  • sub.o:2025-04-04 10:30:00

当运行 make 时:

  • make 发现目标文件 main 存在。
  • 获取 main 的修改时间为 2025-04-04 10:00:00。
  • 检查依赖文件:
    • main.o 的修改时间为 2025-04-04 09:00:00,比 main 的修改时间旧。
    • add.o 的修改时间为 2025-04-04 09:30:00,比 main 的修改时间旧。
    • sub.o 的修改时间为 2025-04-04 10:30:00,比 main 的修改时间新。

由于 sub.o 的修改时间比 main 的修改时间新,make 会认为 main 需要重新生成,因此会执行规则中的命令:

gcc main.o add.o sub.o -o main
4. 特殊情况处理
  • ​依赖文件不存在​​:如果规则中的某个依赖文件不存在,make 会认为这个依赖文件需要生成,从而执行相应的命令来生成这个依赖文件,然后再重新检查目标文件是否需要更新。
  • ​手动修改时间戳​​:如果手动修改了文件的时间戳,但没有实际修改文件内容,make 可能会错误地认为该文件已经更新,从而重新生成依赖它的目标文件。为了避免这种情况,可以使用 touch 命令来正确更新文件的时间戳。

总结

  • ​时间戳机制​​:make 主要依靠文件的时间戳(特别是修改时间 mtime)来判断依赖文件是否有更新。
  • ​比较过程​​:make 会获取目标文件和依赖文件的修改时间,并比较它们的大小。如果任何一个依赖文件的修改时间比目标文件的修改时间新,make 会执行规则中的命令来重新生成目标文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/74605.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HDEBits中组合逻辑类的部分题目练习

文章目录 1. More logic gates2. Truth tables3. 256-to-1 4-bit multiplexer4. 3-bit binary adder5. Signed addition overflow6. 4-digit BCD adder7. Minimum SOP and POS8. Karnaugh map9. K-map implemented with a multiplexer总结 1. More logic gates 题目&#xff1…

Apache httpclient okhttp(2)

学习链接 Apache httpclient & okhttp(1) Apache httpclient & okhttp(2) okhttp github okhttp官方使用文档 okhttp官方示例代码 OkHttp使用介绍 OkHttp使用进阶 译自OkHttp Github官方教程 SpringBoot 整合okHttp…

【git项目管理】长话短说

目录 主要分为三种使用情况 安装git后第一次使用创建新仓库并管理克隆仓库并管理 初次使用git 首先确定电脑的用户名是纯英文,没有中文和奇怪的符号,如果不满足这个条件,参考这个 链接 修改用户名 git config --global user.name "…

算法刷题记录——LeetCode篇(3.2) [第211~212题](持续更新)

更新时间:2025-04-04 算法题解目录汇总:算法刷题记录——题解目录汇总技术博客总目录:计算机技术系列博客——目录页 优先整理热门100及面试150,不定期持续更新,欢迎关注! 215. 数组中的第K个最大元素 给…

【linux学习】linux系统调用编程

目录 一、任务、进程和线程 1.1任务 1.2进程 1.3线程 1.4线程和进程的关系 1.5 在linux系统下进程操作 二、Linux虚拟内存管理与stm32的真实物理内存区别 2.1 Linux虚拟内存管理 2.2 STM32的真实物理内存映射 2.3区别 三、 Linux系统调用函数 fork()、wait()、exec(…

react redux的学习,多个reducer

redux系列文章目录 第一章 简单学习redux,单个reducer 前言 前面我们学习到的是单reducer的使用;要知道redux是个很强大的状态存储库,可以支持多个reducer的使用。 combineReducers ‌combineReducers‌是Redux中的一个辅助函数,主要用于…

Oracle数据库数据编程SQL<3.5 PL/SQL 存储过程(Procedure)>

存储过程(Stored Procedure)是 Oracle 数据库中一组预编译的 PL/SQL 语句集合,存储在数据库中并可通过名称调用执行。它们是企业级数据库应用开发的核心组件。 目录 一、存储过程基础 1. 存储过程特点 2. 创建基本语法 3. 存储过程优点 4. 简单示例 二、没有参数的存储…

手撕AVL树

引入:为何要有AVL树,二次搜索树有什么不足? 二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此产生了AVL树&#xff0c…

《 C语言中的变长数组:灵活而强大的特性》

🚀个人主页:BabyZZの秘密日记 📖收入专栏:C语言 🌍文章目入 一、变长数组的定义二、变长数组的优势三、变长数组的使用示例示例1:动态输入数组大小示例2:变长数组在函数中的应用 四、变长数组的…

【微服务】基础概念

1.什么是微服务 微服务其实就是一种架构风格,他提倡我们在开发的时候,一个应用应该是一组小型服务而组成的,每一个服务都运行在自己的进程中,每一个小服务都通过HTTP的方式进行互通。他更加强调服务的彻底拆分。他并不是仅局限于…

Linux make与makefile 项目自动化构建工具

本文章将对make与makefile进行一些基础的讲解。 假设我们要建造一座房子,建造过程涉及很多步骤,比如打地基、砌墙、安装门窗、粉刷墙壁等。每个步骤都有先后顺序,并且有些步骤可能依赖于其他步骤的完成。比如,你必须先打好地基才…

如何判断多个点组成的3维面不是平的,如果不是平的,如何拆分成多个平面

判断和拆分三维非平面为多个平面 要判断多个三维点组成的面是否为平面,以及如何将非平面拆分为多个平面,可以按照以下步骤进行: 判断是否为平面 平面方程法: 选择三个不共线的点计算平面方程:Ax By Cz D 0检查其…

多layout 布局适配

安卓多布局文件适配方案操作流程 以下为通过多套布局文件适配不同屏幕尺寸/密度的详细步骤,结合主流适配策略及最佳实践总结: 一、‌创建多套布局资源目录‌ ‌按屏幕尺寸划分‌ 在 res 目录下创建以下文件夹(根据设备特性自动匹配&#xff…

Java 大视界 -- Java 大数据在智能农业无人机植保作业路径规划与药效评估中的应用(165)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

美关税加征下,Odoo免费开源ERP如何助企业破局?

近期,美国特朗普政府推行的关税政策对全球供应链和进出口企业造成巨大冲击,尤其是依赖中美贸易的企业面临成本激增、利润压缩和合规风险。在此背景下,如何通过数字化转型优化管理效率、降低运营成本成为企业生存的关键。本文以免费开源ERP系统…

go游戏后端开发25:红中麻将规则介绍

一、游戏基础规则介绍 在开发红中麻将游戏之前,我们需要先了解其基础规则。红中麻将的牌面由 a、b、c、d 四种花色组成,其中 a、b、c 分别代表万、条、筒,每种花色都有 1 - 9 的九种牌,每种牌各有四张,总计 36 张 4 …

Unity:平滑输入(Input.GetAxis)

目录 1.为什么需要Input.GetAxis? 2. Input.GetAxis的基本功能 3. Input.GetAxis的工作原理 4. 常用参数和设置 5. 代码示例:用GetAxis控制角色移动 6. 与Input.GetAxisRaw的区别 7.如何优化GetAxis? 1.为什么需要Input.GetAxis&…

OpenCV:计算机视觉的强大开源库

文章目录 引言一、什么是OpenCV?1.OpenCV的核心特点 二、OpenCV的主要功能模块1. 核心功能(Core Functionality)2. 图像处理(Image Processing)3. 特征检测与描述(Features2D)4. 目标检测&#…

AI浪潮下的IT职业转型:医药流通行业传统IT顾问的深度思考

AI浪潮下的IT职业转型:医药流通行业传统IT顾问的深度思考 一、AI重构IT行业的技术逻辑与实践路径 1.1 医药流通领域的智能办公革命 在医药批发企业的日常运营中,传统IT工具正经历颠覆性变革。以订单处理系统为例,某医药集团引入AI智能客服…

Qt进阶开发:QFileSystemModel的使用

文章目录 一、QFileSystemModel的基本介绍二、QFileSystemModel的基本使用2.1 在 QTreeView 中使用2.2 在 QListView 中使用2.3 在 QTableView 中使用 三、QFileSystemModel的常用API3.1 设置根目录3.2 过滤文件3.2.1 仅显示文件3.2.2 只显示特定后缀的文件3.2.3 只显示目录 四…