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.pswp.cn/web/74605.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/74605.shtml
英文地址,請注明出處:http://en.pswp.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 只顯示目錄 四…