Linux make與makefile 項目自動化構建工具

本文章將對make與makefile進行一些基礎的講解。

假設我們要建造一座房子,建造過程涉及很多步驟,比如打地基、砌墻、安裝門窗、粉刷墻壁等。每個步驟都有先后順序,并且有些步驟可能依賴于其他步驟的完成。比如,你必須先打好地基才能砌墻,必須先砌好墻才能安裝門窗。這時候,你需要一個詳細的施工流程表,告訴工人每一步該做什么,以及在什么條件下可以進行下一步。make?和?makefile?就像是這個施工流程表。

一、什么是?make?和?makefile

  • ??makefile??:是一個文本文件,里面包含了一系列的規則,這些規則定義了如何從源文件生成目標文件,以及各個目標文件之間的依賴關系。
  • ??make??:是一個構建自動化工具,它會讀取?makefile?中的規則,并根據這些規則來決定哪些文件需要重新編譯或構建。

二、makefile?的基本結構

一個典型的?makefile?包含以下幾個部分:

  • ??目標(Target)??:你想要生成的東西,比如一個可執行文件或一個目標文件。
  • ??依賴(Dependency)??:生成目標所需要的文件。
  • ??命令(Command)??:為了生成目標需要執行的命令。

一個簡單的?makefile?示例:

# 目標:生成可執行文件 main
main: main.o add.o sub.ogcc main.o add.o sub.o -o main# 目標:生成 main.o
main.o: main.cgcc -c main.c# 目標:生成 add.o
add.o: add.cgcc -c add.c# 目標:生成 sub.o
sub.o: sub.cgcc -c sub.c# 清理生成的文件
clean:rm -f main main.o add.o sub.o

解釋

  1. ??目標?main??:

    • ??依賴??:main.oadd.o?和?sub.o
    • ??命令??:gcc main.o add.o sub.o -o main。這個命令表示將?main.oadd.o?和?sub.o?鏈接成一個可執行文件?main
  2. ??目標?main.o??:

    • ??依賴??:main.c
    • ??命令??:gcc -c main.c。這個命令表示將?main.c?編譯成目標文件?main.o
  3. ??目標?add.o?和?sub.o??:

    • 類似于?main.o,分別將?add.c?和?sub.c?編譯成目標文件。
  4. ??目標?clean??:

    • ??命令??:rm -f main main.o add.o sub.o。這個命令用于清理生成的可執行文件和目標文件。

三、make?的工作原理

當你運行?make?命令時,make?會讀取?makefile?文件,并按照以下步驟工作:

  1. ??讀取?makefile??:make?會解析?makefile?中的規則,構建一個依賴圖。
  2. ??確定目標??:默認情況下,make?會嘗試生成?makefile?中第一個目標(在這個例子中是?main)。
  3. ??檢查依賴??:make?會檢查目標的依賴文件是否存在,以及這些依賴文件是否有更新。如果依賴文件不存在或比目標文件新,make?會執行相應的命令來更新目標文件。(如何檢查的呢?)
  4. ??執行命令??:make?會按照依賴圖的順序執行命令,生成最終的目標。

四、示例運行

假設你有以下文件:

  • main.c
  • add.c
  • sub.c

運行?make?命令:

make?會根據?makefile?中的規則,依次編譯?main.cadd.c?和?sub.c,然后將它們鏈接成可執行文件?main

如果你修改了?add.c?文件,再次運行?make

make?會檢測到?add.c?文件有更新,只重新編譯?add.c?成?add.o,然后重新鏈接生成?main

如果你想清理生成的文件,可以運行:

make clean

make?會執行?clean?目標中的命令,刪除?mainmain.oadd.o?和?sub.o?文件。

五、?.PHONY

在?makefile?中,.PHONY?是一個特殊的目標,用于聲明某些目標是“偽目標”。偽目標不是實際的文件,而是用于執行特定的命令或任務。使用?.PHONY?可以避免與同名文件沖突,并且可以提高?make?的執行效率。

1.為什么需要?.PHONY
  1. ??避免與文件名沖突??:如果有一個目標名與文件名相同,make?會誤認為該目標是文件,而不是一個任務。使用?.PHONY?可以避免這種沖突。
  2. ??提高執行效率??:make?會檢查文件的時間戳來決定是否需要重新生成目標文件。對于偽目標,make?不需要檢查時間戳,可以直接執行相應的命令,從而提高執行效率。
  3. ??明確意圖??:使用?.PHONY?可以明確告訴其他開發者,這個目標是一個虛擬的任務,而不是一個實際的文件。
2.如何使用?.PHONY

以下是一個簡單的?makefile?示例,展示了如何使用?.PHONY

# 聲明偽目標
.PHONY: clean test# 默認目標
all: main# 生成可執行文件 main
main: main.o add.o sub.ogcc main.o add.o sub.o -o main# 生成 main.o
main.o: main.cgcc -c main.c# 生成 add.o
add.o: add.cgcc -c add.c# 生成 sub.o
sub.o: sub.cgcc -c sub.c# 清理生成的文件
clean:rm -f main main.o add.o sub.o# 運行測試
test:./mainecho "All tests passed!"

在這個示例中:

  • .PHONY: clean test?聲明了?clean?和?test?是偽目標。
  • clean?目標用于清理生成的文件,它不生成任何實際的文件。
  • test?目標用于運行測試,它也不生成任何實際的文件。

示例解釋

1.聲明偽目標

.PHONY: clean test

這行代碼告訴?makeclean?和?test?是偽目標,而不是實際的文件。即使當前目錄下存在名為?clean?或?test?的文件,make?也會執行相應的命令。

2. 使用偽目標

  • ??清理文件??:

    make clean

    這條命令會執行?clean?目標中的命令,刪除?mainmain.oadd.o?和?sub.o?文件。

  • ??運行測試??:

    make test

    這條命令會執行?test?目標中的命令,運行?main?可執行文件,并輸出 "All tests passed!"。

3. 避免沖突

假設當前目錄下有一個名為?clean?的文件,如果沒有使用?.PHONY?聲明?clean?為偽目標,make?會認為?clean?是一個文件,而不是一個任務。此時,運行?make clean?不會執行任何命令,因為?clean?文件已經存在,且沒有依賴關系需要更新。

通過使用?.PHONY,可以避免這種沖突,確保?make clean?總是執行清理命令。

.PHONY?不僅可以用于常見的清理和測試任務,還可以用于其他任何不需要生成實際文件的任務。

  • ??.PHONY?的作用??:聲明偽目標,避免與文件名沖突,提高執行效率,明確意圖。
  • ??如何使用??:在?makefile?中使用?.PHONY?關鍵字,后跟偽目標的名稱列表。
  • ??常見用途??:清理文件、運行測試、生成文檔、打包發布、代碼風格檢查等。
  • 偽目標總是會被執行,不會被攔截。(比如我們重復make會提示已經make了不讓我們make,但是如果我們把他搞成偽目標,那么就不會受此限制了)。

六、優點

  1. ??自動化??:make?可以自動處理文件之間的依賴關系,只重新編譯需要更新的文件,節省時間和資源。
  2. ??可維護性??:通過?makefile,你可以清晰地定義項目的構建流程,方便團隊協作和項目管理。
  3. ??靈活性??:makefile?支持復雜的規則和條件判斷,可以適應各種構建需求。

七、缺點

  1. ??維護成本??:隨著項目規模的增大,makefile?可能會變得非常復雜,維護起來比較困難。

八、總結

  • ??makefile??:是一個包含構建規則的文本文件,定義了如何從源文件生成目標文件以及各個目標文件之間的依賴關系。
  • ??make??:是一個構建自動化工具,讀取?makefile?中的規則,并根據這些規則決定哪些文件需要重新編譯或構建。

通過?make?和?makefile,你可以高效地管理和構建項目,確保每次構建都是基于最新的文件狀態。

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

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

相關文章

如何判斷多個點組成的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 只顯示目錄 四…

KAPC的前世今生--(下)下RPCRT4!NMP_SyncSendRecv函數分析

第一部分:nt!KiDeliverApc函數調用nt!IopCompleteRequest函數后準備返回 1: kd> kv # ChildEBP RetAddr Args to Child 00 ba3eec18 80a3c83b 896e4e40 ba3eec64 ba3eec58 nt!IopCompleteRequest0x3a3 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv…

深入理解C++引用:從基礎到現代編程實踐

一、引用的本質與基本特性 1.1 引用定義 引用是為現有變量創建的別名,通過&符號聲明。其核心特點: 必須初始化且不能重新綁定 與被引用變量共享內存地址 無獨立存儲空間(編譯器實現) 類型必須嚴格匹配 int value 42; in…

嵌入式Linux開發環境搭建,三種方式:虛擬機、物理機、WSL

目錄 總結寫前面一、Linux虛擬機1 安裝VMware、ubuntu18.042 換源3 改中文4 中文輸入法5 永不息屏6 設置 root 密碼7 安裝 terminator8 安裝 htop(升級版top)9 安裝 Vim10 靜態IP-虛擬機ubuntu11 安裝 ssh12 安裝 MobaXterm (SSH)…

軟件工程面試題(二十七)

1、j a v a 對象初始化順序 1.類的初始化(initialization class & interface) 2.對象的創建(creation of new class instances) 順序:應為類的加載肯定是第一步的,所以類的初始化在前。大體的初始化順序是: 類初始化 -> 子類構造函數 -> 父類構造函數 -&g…

《AI大模型開發筆記》MCP快速入門實戰(一)

目錄 1. MCP入門介紹 2. Function calling技術回顧 3. 大模型Agent開發技術體系回顧 二、 MCP客戶端Client開發流程 1. uv工具入門使用指南 1.1 uv入門介紹 1.2 uv安裝流程 1.3 uv的基本用法介紹 2.MCP極簡客戶端搭建流程 2.1 創建 MCP 客戶端項目 2.2 創建MCP客戶端…

Java中的正則表達式Lambda表達式

正則表達式&&Lambda表達式 正則表達式和Lambda表達式是Java編程中兩個非常實用的特性。正則表達式用于字符串匹配與處理,而Lambda表達式則讓函數式編程在Java中變得更加簡潔。本文將介紹它們的基本用法,并結合示例代碼幫助理解。同時要注意&…

Talend API Tester

背景 工作中有時會需要調測http接口,postman無疑是最常用最流行的工具,但是有一個致命問題,必須要登錄,而工作經常是私網環境,導致使用非常不方便。因此想找一個Windows系統上的輕量級、無需登錄即可使用的http測試工…

leetcode數組-移除元素

題目 題目鏈接:https://leetcode.cn/problems/remove-element/ 給你一個數組 nums 和一個值 val,你需要 原地 移除所有數值等于 val 的元素。元素的順序可能發生改變。然后返回 nums 中與 val 不同的元素的數量。 假設 nums 中不等于 val 的元素數量為…

什么是市盈率,通俗解釋清楚

市盈率就是“股價和公司盈利能力”的一個比例關系,簡單來說,就是你花多少錢買股票,要等多少年才能通過公司賺的錢“回本”。 假設你買了一家公司的股票,花了100塊錢,這家公司每年能賺10塊錢。那市盈率就是100除以10&am…

突破傳統認知:聚類算法的底層邏輯與高階應用全景解析

一、維度革命:重新定義聚類分析的認知邊界 在人工智能的浩瀚星空中,聚類算法猶如一組精密的星際導航儀,幫助我們在無序的數據宇宙中發現隱藏的秩序。這項起源于人類本能分類需求的技術,經歷了從簡單分組到智能識別的蛻變&#xf…

【愚公系列】《高效使用DeepSeek》051-產品創新研發

??【技術大咖愚公搬代碼:全棧專家的成長之路,你關注的寶藏博主在這里!】?? ??開發者圈持續輸出高質量干貨的"愚公精神"踐行者——全網百萬開發者都在追更的頂級技術博主! ?? 江湖人稱"愚公搬代碼",用七年如一日的精神深耕技術領域,以"…