Linux開發工具——make/makefile

📝前言:
這篇文章我們來講講Linux開發工具——make/makefile

🎬個人簡介:努力學習ing
📋個人專欄:Linux
🎀CSDN主頁 愚潤求學
🌄其他專欄:C++學習筆記,C語言入門基礎,python入門基礎,C++刷題專欄


目錄

  • 一,make/makefile基礎介紹
    • make
    • Makefile
  • 二,具體示例
    • 1. 基礎示例
      • 1.1 時間戳
      • 1.2 是否重新編譯判斷
    • 2. 進階1——依賴鏈
    • 3. 進階2——變量替換
    • 4. 進階3——多文件
      • 4.1 獲取當前目錄下的所有文件
        • 執行的命令不回顯
      • 4.2 %<
      • 4.3 模式規則

一,make/makefile基礎介紹

make/Makefile用于自動化構建和管理項目。

make

  • 功能make是一個命令工具,它根據Makefile定義的規則來自動構建和管理項目。它可以自動檢測源文件的修改情況,并僅重新編譯那些需要更新的目標文件,從而大大提高了編譯效率。
  • 工作原理make通過讀取Makefile中的規則,分析目標文件和依賴文件之間的關系(簡稱依賴關系)。然后,它根據文件的時間戳modify時間)來判斷哪些文件需要重新編譯。如果一個依賴文件的修改時間晚于目標文件,或者目標文件不存在,make就會執行相應的命令來更新目標文件。
  • 使用方法:在項目目錄中,只需在命令行中輸入make命令,它就會自動查找當前目錄下的Makefile,并按照其中的規則進行構建。如果Makefile中有多個目標,make默認構建第一個規則,后面的要指定要構建的特定目標,例如make target_name

Makefile

  • 作用Makefile是一個文本文件,它包含了一系列規則,用于告訴make工具如何構建項目。它定義了項目中的目標文件、依賴文件以及構建目標所需的命令(方法)。
  • 基本結構Makefile由一系列規則組成,每個規則通常包含以下部分:
    • 目標:通常是要構建的文件,如可執行文件、目標文件或庫文件。也可以是一個抽象的目標,如clean用于清理生成的文件。
    • 依賴:目標所依賴的文件列表。
    • 命令:用于構建目標的命令。命令必須以Tab鍵開頭。

(也可以認為:規則 = 依賴關系 + 依賴方法


二,具體示例

1. 基礎示例

先對前面介紹到的基礎的概念和用法做演示。

步驟:

  1. 現在當前目錄下創建Makefile文件:touch ./Makefile
  2. 根據需求,編寫Makefile
    在這里插入圖片描述

解釋:

  1. code.exe是目標文件,code.c是源文件(這是一組依賴關系,code.exe依賴code.c
  2. Tab開頭,后面寫依賴方法(構造目標用的命令)
  3. 一個抽象的目標clean,可以沒有所依賴的文件列表
  4. 依賴方法

調用示例:
在這里插入圖片描述

  1. make默認調用第一個規則,即code.exe:code.c這一個
  2. make clean,調用clean對應的規則
  3. 為什么連續調用make會失敗呢?

因為:make根據文件modify時間戳來判斷哪些文件需要重新編譯。


1.1 時間戳

那什么是modify時間戳,?
stat查看文件時間屬性
在這里插入圖片描述

  • Access:訪問時間,當文件被查看,如cat的時候會被修改(但有一些系統會優化,即:多次查看后才修改,為了減少磁盤I/O操作)
  • Modify:修改時間,代表文件最后一次被修改的時間,即內容有所改動,Modify就會改變
  • Change:變更時間,當文件屬性有變化的時候會改變
  • Birth:誕生時間,創建時的時間

1.2 是否重新編譯判斷

當源文件的modify時間相比目標文件“舊”,代表沒有源文件沒有修改,則不重新編譯
當源文件的modify時間相比目標文件“新”,代表源文件修改了,則重新編譯

在這里插入圖片描述
如圖:我們在沒有執行make之前,只有源文件1,執行完后,有了目標文件1,時間關系如上。此時再執行make就不會再重新編譯

如果我們更改了源文件:
在這里插入圖片描述
這時候,代表有新內容,目標文件就需要重新編譯

那有沒有辦法讓make無視時間戳,讓依賴方法總是被執行呢?
有的兄弟,有的。那就是特殊目標聲明:.PHONY,將目標標記為偽目標。
在這里插入圖片描述

此時,make 不用去檢查偽目標對應的文件是否存在、是否更新,而是直接執行命令
在這里插入圖片描述


2. 進階1——依賴鏈

在這里插入圖片描述
在這里插入圖片描述
依賴鏈的結構就像一個棧:

  1. 檢查其依賴code.o,發現 code.o 不存在,則依賴方法入棧
  2. 檢查 code.o 的依賴 code.s,發現 code.s 不存在,則依賴方法也入棧
  3. 檢查 code.i 的依賴 code.c,發現 code.c 存在,則執行code.i的依賴方法
  4. 將棧中依賴方法依次執行

3. 進階2——變量替換

定義變量
=:遞歸展開變量(不會在定義變量時立即對右側的表達式進行求值,而是在使用該變量時才進行求值。這意味著變量的值可能會因為其他變量的改變而改變)
:=:簡單展開變量(在定義變量時就對右側的表達式進行求值,變量的值在定義時就已經確定,后續不會因為其他變量的改變而改變)

引用變量
$(變量名)

示例:
在這里插入圖片描述
$@$^
$@指代目標文件,$^指代依賴文件列表
即上面的內容可以改成:
在這里插入圖片描述
這里$^會自動對應這個方法的依賴關系中的$(SRC)$@對應$(BIN)


4. 進階3——多文件

4.1 獲取當前目錄下的所有文件

在Makefile中執行命令:$(shell 命令)
使用函數:$(函數名 參數1,參數2…)

獲取當前目錄下所有.c文件后綴的方法:

  1. $(shell ls *.c),回顧:ls這個命令只列出名稱
  2. $(wildcard *.c)

在這里插入圖片描述輸入make運行結果:
在這里插入圖片描述

執行的命令不回顯

在命令前加:@
在這里插入圖片描述
效果:
在這里插入圖片描述

4.2 %<

當有多個源文件需要編譯成目標文件,且每個源文件的編譯命令基本相同時,使用 $< 能避免重復書寫源文件名稱。

$<被自動替換為當前規則中列出的第一個依賴文件的名稱。例如,對于規則 target: dep1 dep2 dep3,在其對應的命令里使用 $<,它就代表 dep1

4.3 模式規則

%:通配符,如%.c:所有以.c結尾的文件

%.o: %.c :這個規則中,%所匹配的內容在目標和依賴中是相同的。(同名)
當 make工具處理這個規則時,會針對每個 .o 文件的構建分別執行一次規則里的命令

錯誤寫法:
在這里插入圖片描述
報錯:

make: *** No targets.  Stop.

因為:%.o: %.c只是一個模式規則,并沒有具體構建目標。具體的構建目標是指在 Makefile 中明確指定要構建的文件,文件名需要是完整且能明確指向一個具體文件的。

正確使用示例:
在這里插入圖片描述

額外語法:

  • 命令可以多行,但是也要Tab開頭
  • 注釋用#符號

理解執行過程:

  1. 具體構建目標:code.exe,依賴所有.o文件,沒有.o文件,于是到下一個規則%.o:%.c
  2. %.o:%.c規則中,make會針對每個.o文件分別執行一次命令,此時,每個.o文件變成了這個規則里的具體構建目標

運行結果:
在這里插入圖片描述


🌈我的分享也就到此結束啦🌈
要是我的分享也能對你的學習起到幫助,那簡直是太酷啦!
若有不足,還請大家多多指正,我們一起學習交流!
📢公主,王子:點贊👍→收藏?→關注🔍
感謝大家的觀看和支持!祝大家都能得償所愿,天天開心!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/75638.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/75638.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/75638.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python加載訓練好的模型并進行葉片實例分割預測

要基于“GMT: Guided Mask Transformer for Leaf Instance Segmentation”進行代碼復現&#xff0c;可按照以下步驟利用Python實現&#xff1a; 環境配置 克隆倉庫&#xff1a;在終端中使用git clone https://github.com/vios-s/gmt-leaf-ins-seg.git命令&#xff0c;將項目代…

AI平臺初步規劃實現和想法

要實現一個類似Coze的工作流搭建引擎&#xff0c;可以結合SmartEngine作為后端工作流引擎&#xff0c;ReactFlow作為前端流程圖渲染工具&#xff0c;以及Ant Design作為UI組件庫。以下是實現的步驟和關鍵點&#xff1a; ### 1. 后端工作流引擎&#xff08;SmartEngine&#xf…

Pycharm 啟動時候一直掃描索引/更新索引 Update index/Scanning files to index

多個項目共用一個虛擬環境&#xff0c;有助于加快PyCharm 啟動嗎 chatgpt 4o認為很有幫助&#xff0c;gemini 2.5pro認為沒鳥用&#xff0c;我更認可gemini的觀點。不知道他們誰在一本正經胡說八道。 -------- 打開pycharm的時候&#xff0c;下方的進度條一直顯示在掃描文件…

dify新版本1.1.3的一些問題

本人使用window版本上構建dify&#xff0c;采用docker方法啟動 1、拉取鏡像問題 windows上更改拉取鏡像倉庫地址 優化加速參考&#xff1a;青春不留白/Docker-hub 如果還是拉取比較慢的話&#xff0c;建議科學上網解決。 2、啟動問題 發生報錯Dify:failed to init dify plu…

4.2-3 fiddler抓取手機接口

安卓&#xff1a; 長按手機連接的WiFi&#xff0c;點擊修改網絡 把代理改成手動&#xff0c;服務器主機選擇自己電腦的IP地址&#xff0c;端口號為8888&#xff08;在dos窗口輸入ipconfig查詢IP地址&#xff0c;為ipv4&#xff09; 打開手機瀏覽器&#xff0c;輸入http://自己…

Spring Boot中自定義注解的創建與使用

&#x1f31f; 前言 歡迎來到我的技術小宇宙&#xff01;&#x1f30c; 這里不僅是我記錄技術點滴的后花園&#xff0c;也是我分享學習心得和項目經驗的樂園。&#x1f4da; 無論你是技術小白還是資深大牛&#xff0c;這里總有一些內容能觸動你的好奇心。&#x1f50d; &#x…

2024第十五屆藍橋杯大賽軟件賽省賽C/C++ 大學 B 組

記錄刷題的過程、感悟、題解。 希望能幫到&#xff0c;那些與我一同前行的&#xff0c;來自遠方的朋友&#x1f609; 大綱&#xff1a; 1、握手問題-&#xff08;解析&#xff09;-簡單組合問題&#xff08;別人叫她 鴿巢定理&#xff09;&#x1f607;&#xff0c;感覺叫高級了…

HTML應用指南:利用POST請求獲取三大運營商5G基站位置信息(一)

在當前信息技術迅猛發展的背景下,第五代移動通信(5G)技術作為新一代的無線通信標準,正逐步成為推動社會進步和產業升級的關鍵驅動力。三大電信運營商(中國移動、中國聯通、中國電信)在全國范圍內的5G基站部署,不僅極大地提升了網絡性能,也為智能城市、物聯網、自動駕駛…

C++學習之線程

目錄 1.進程和線程的概念 2.線程內核三級映射 3.線程優缺點 4.創建線程和獲取線程ID的函數 5.創建子線程 6.循環創建N個子線程 7.子線程傳參地址錯誤演示分析 8.主、子線程共享全局變量、堆空間 9.線程退出 10.pthread join回收線程退出值 11.pthread_cancel 12.殺死…

element-plus中,表單校驗的使用

目錄 一.案例1&#xff1a;給下面的表單添加校驗 1.目的要求 2.步驟 ①給需要校驗的el-form-item項&#xff0c;添加prop屬性 ②定義一個表單校驗對象&#xff0c;里面存放了每一個prop的檢驗規則 ③給el-form組件&#xff0c;添加:rules屬性 ④給el-form組件&#xff0…

團體設計程序天梯賽L2-025 # 分而治之

文章目錄 題目解讀輸入格式輸出格式 思路Ac Code參考 題目解讀 在戰爭中&#xff0c;我們希望首先攻下敵方的部分城市&#xff0c;使其剩余的城市變成孤立無援&#xff0c;然后再分頭各個擊破。為此參謀部提供了若干打擊方案。本題就請你編寫程序&#xff0c;判斷每個方案的可…

Arduino示例代碼講解:Knock Sensor 敲擊感知器

Arduino示例代碼講解:Knock Sensor 敲擊感知器 Knock Sensor 敲擊感知器功能概述硬件部分:軟件部分:代碼逐行解釋定義常量定義變量`setup()` 函數`loop()` 函數工作原理Knock Sensor 敲擊感知器 這段代碼是一個Arduino示例程序,用于檢測敲擊聲。它通過讀取一個壓電元件(p…

【百日精通JAVA | SQL篇 | 第三篇】 MYSQL增刪改查

SQL得最核心就是增刪改查 一個后端開發&#xff0c;在工作中&#xff0c;最常見的場景就是CRUD。 插入數據 insert into student values (1,zhangsan); 指定列插入數據 同時多個列明之間使用逗號&#xff0c;來分割 insert into student (name) values (zhaoliu); 這個黑框…

ggscitable包通過曲線擬合深度挖掘一個陌生數據庫非線性關系

很多新手剛才是總是覺得自己沒什么可以寫的&#xff0c;自己不知道選什么題材進行分析&#xff0c;使用scitable包ggscitable包后這個完全不用擔心&#xff0c;選題多到你只會擔心你寫不完&#xff0c;寫得不夠快。 既往咱們使用scitable包交互效應深度挖掘一個陌生數據庫&…

ctfshow VIP題目限免 版本控制泄露源碼2

根據題目提示是版本控制泄露源碼 版本控制&#xff08;Version Control&#xff09;是一種在軟件開發和其他領域中廣泛使用的技術&#xff0c;用于管理文件或項目的變更歷史。 主流的版本控制工具&#xff1a; ?Git?&#xff1a;目前最流行的分布式版本控制系統。?SVN?&am…

2025-04-05 吳恩達機器學習5——邏輯回歸(2):過擬合與正則化

文章目錄 1 過擬合1.1 過擬合問題1.2 解決過擬合 2 正則化2.1 正則化代價函數2.2 線性回歸的正則化2.3 邏輯回歸的正則化 1 過擬合 1.1 過擬合問題 欠擬合&#xff08;Underfitting&#xff09; 模型過于簡單&#xff0c;無法捕捉數據中的模式&#xff0c;導致訓練誤差和測試誤…

如何用人工智能大模型,進行作業批改?

今天我們學習人工智能大模型如何進行作業批改。手把手學習視頻請訪問https://edu.csdn.net/learn/40402/666452 第一步&#xff0c;進入訊飛星火。打開google瀏覽器&#xff0c;輸入百度地址后&#xff0c;搜索”訊飛星火”&#xff0c;在搜索的結果中&#xff0c;點第一個訊飛…

C++學習筆記之 模板|函數模板|類模板

函數模板 類模板 定義&#xff1a;函數模板是建立一個通用函數&#xff0c;它所用到的數據的類型&#xff08;包括返回值類型、形參類型、局部變量類型 &#xff09;可以不具體指定&#xff0c;而是用一個虛擬的類型來代替&#xff08;用標識符占位&#xff09;&#xff0c;在…

正則入門到精通

? 一、正則表達式入門? 正則表達式本質上是一串字符序列&#xff0c;用于定義一個文本模式。通過這個模式&#xff0c;我們可以指定要匹配的文本特征。例如&#xff0c;如果你想匹配一個以 “abc” 開頭的字符串&#xff0c;正則表達式可以寫作 “^abc”&#xff0c;其中 …

對備忘錄模式的理解

對備忘錄模式的理解 一、場景1、題目【[來源](https://kamacoder.com/problempage.php?pid1095)】1.1 題目描述1.2 輸入描述1.3 輸出描述1.4 輸入示例1.5 輸出示例 2、理解需求 二、不采用備忘錄設計模式1、代碼2、問題3、錯誤的備忘錄模式 三、采用備忘錄設計模式1、代碼1.1 …