【Linux】make/Makefile工具篇

目錄

  • 一、自動化構建
  • 二、make/Makefile
    • 2.1 見識一個簡單的make/Makefile
    • 2.2 Makefile的基本語法
    • 2.3 Makefile的語法細節

在這里插入圖片描述
個人主頁<—請點擊
Linux專欄<—請點擊

一、自動化構建

自動化構建是指通過構建工具(如make)解析構建腳本(如Makefile),自動執行一系列步驟(編譯、鏈接等)以將源代碼生成可執行程序或庫的過程

想象一下你要編譯一個大型C++項目,比如一個游戲引擎,它有成千上萬個源文件.cpp和頭文件.h

如果沒有自動化構建,你會怎么做?你可能會在終端里輸入一條巨長的命令:g++ main.cpp renderer.cpp physics.cpp audio.cpp network.cpp ...(列出所有文件) -o MyGameEngine -lSDL2 -lOpenGL ...,這種方法效率低下、容易出錯、無法復用,并且依賴管理困難。自動化構建就是為了解決這些問題而生的。

所以會不會寫Makefile,從側面說明了一個人是否具備完成大型工程的能力。在Windowsvs幫我們做了自動化構建,而Linux下我們需要使用make/Makefile完成對自動化項目的構建。

上述我們所說的makeMakefile,其中前者是一條命令,而后者是一個文件。后者也可以寫成makefile

二、make/Makefile

2.1 見識一個簡單的make/Makefile

現在我們在我們的當前目錄下準備了一份文件code.c,里面寫了一些代碼,現在我要使用make對它進行編譯。我們開始創建Makefile文件,并在其中寫入以下指令:
在這里插入圖片描述
我們執行make命令對code.c進行編譯。
在這里插入圖片描述
如上圖,make命令自動執行了我在Makefile文件中寫入的指令生成了可執行文件!

那么Makefile中寫的那兩行究竟是什么意思呢?接著往下看。
在這里插入圖片描述
如上圖,形成code.exe目標文件需要依賴code.c文件,而解決依賴關系需要依賴下面的依賴方法gcc -o code.exe code.c,所以依賴關系和依賴方法共同構成了形成可執行程序的語義。

2.2 Makefile的基本語法

其中上面的 依賴方法一行必須以Tab鍵開頭,且對應的依賴方法可以是多條,接下來我們依據上期博客講解的編譯的詳細過程進行編寫Makefile文件。注意:Makefile里面想要注釋是#
在這里插入圖片描述
執行make命令:
在這里插入圖片描述
如上圖,make命令會解析Makefile文件,解析過程中會形成推導棧,這個棧中是依賴方法的集合,直到找到存在的依賴文件時就會執行相應的依賴方法,然后依次出棧,就形成了上圖中依次運行的指令。如果make推導失敗了它就會報錯

Makefile其實就是一種腳本語言,make要從最終目標code.exe開始,遞歸地向下檢查依賴,再向上決定是否構建。這個過程是深度優先的

當然我們實際的寫法可不會這樣寫,太麻煩了。

接下來我們學習一個新的語法,我們在vs下不僅要能夠生成可執行程序,我們還需要能夠清理呀,所以接下來清理可執行程序。
在這里插入圖片描述

其中.PHONY的作用是聲明一個符號clean是偽目標clean的依賴方法是清理可執行程序,這樣就可以清理了。
在這里插入圖片描述

從上面clean的執行操作,我們可以知道 make命令后面可以直接跟“目標名”
在這里插入圖片描述
如上圖,make命令后面跟誰就會解析誰的依賴關系和依賴方法,并且make命令默認只會推導一條完整的鏈路

現在我把.PHONY:clean部分放在前面,再執行make命令。
在這里插入圖片描述
所以單獨執行make指令,默認只推導第一個依賴關系對應的推導鏈。

.PHONY:用來修飾一個目標文件是偽目標,這個我們剛講過。偽目標的本質是總是被執行的。像我們的形成code.exe的命令通常情況下只能被執行一次
在這里插入圖片描述
而當我們對code.exe進行修飾后就可以一直執行了。
在這里插入圖片描述
不建議.exe.PHONY修飾,這樣能夠加快編譯的效率,而且當你的源文件再次被修改后,就又可以進行編譯操作了。
在這里插入圖片描述
那么無法二次編譯老項目是如何做到的呢? 答案是通過比較創建時間的新舊

在這里插入圖片描述
Linux下有一個stat命令,可以查看文件的相關時間信息。
在這里插入圖片描述
當源文件code.c文件內容被更改時間比code.exe的文件內容被更改時間新,make就允許進行重新編譯。而.PHONY修飾能夠總是執行,是讓make工具忽略了時間對比

擴充:上圖中,文件內容被更改時Modify時間會更改,文件屬性被更改時Change時間會更改,文件被訪問特定次數后,Access時間會更改

2.3 Makefile的語法細節

我們在了解基本語法的時候,我們發現編譯、清理的過程,make會將執行命令回顯出來,為了不讓它回顯出來,可以在命令前加上@
在這里插入圖片描述

現在假設我要對生成的文件名進行修改,我還要一個名稱一個名稱更改,太麻煩了吧,所以我們使用變量對Makefile做出大的更改!
在這里插入圖片描述
如上圖所示,我對Makefile文件進行了更改,接下來我們逐行分析。首先定義了兩個變量名BINSRC分別代表目標文件源文件注意=兩側不要加空格。下面的$()的作用相當于提取變量名對應的文件第五行中的$@$^是自動變量,前者代表目標文件,后者代表依賴文件

很好,現在我們能夠編譯一個源文件了,那如果源文件有100個呢?
在這里插入圖片描述
如上圖,創建了100個源文件,現在我們要將他們編譯性成一個可執行程序。我們要按照下圖的方式進行編譯:
在這里插入圖片描述
首先,如何獲取這100個源文件就是一個問題,一個個寫嗎? 當然不行,這里我們可以使用shell命令ls進行獲取,或者使用Makefile中自帶的wildcard函數獲取。
在這里插入圖片描述
這就是兩種獲取源文件的方法,第一個是執行ls命令將列出的源文件提取寫入到SRC中,第二個是使用指定函數獲取源文件。

接下來完成Makefile的編寫。
在這里插入圖片描述
為了獲取.o文件,我們還要定義一個變量OBJ,其中SRC:.c=.o是將SRC的所有同名.c替換成為.o形成目標文件列表。接下來又對gcc、rm -rf、echo命令進行了包裝。然后在編譯的過程將每個文件的.c.o的過程和.o可執行程序的過程使用echo打印了出來。

另外%.c展開當前目錄下所有的.c%.o: 同時展開當前目錄下所有的.ogcc -c code.c -o code.o這個命令的-o code.o部分也可以去掉,所以就變成了上圖中這樣,%<是將展開的依賴.c文件,?個?個的交給gcc

在這里插入圖片描述
如上圖執行make命令,它就自動將100個源文件先編譯成.o,然后再進行鏈接編譯成了可執行程序code.exe。我們試著運行一下。
在這里插入圖片描述

在這里插入圖片描述
如上圖再make clean它就自動將形成的.o可執行程序清除了!

總結:
以上就是本期博客分享的全部內容啦!如果覺得文章還不錯的話可以三連支持一下,你的支持就是我前進最大的動力!
技術的探索永無止境! 道阻且長,行則將至!后續我會給大家帶來更多優質博客內容,歡迎關注我的CSDN賬號,我們一同成長!
(~ ̄▽ ̄)~

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

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

相關文章

如何在企業微信上以 HTTPS 方式訪問內網 OA/ERP 等系統?

企業微信可以將 ZeroNews 平臺上添加的內網應用集成到企業微信的工作臺。這樣&#xff0c;用戶即使在外部網絡環境中&#xff0c;也可以通過企業微信訪問內網的 OA、ERP 等應用。以下是企業在 Linux 服務器上部署 OA 系統&#xff0c;并通過 ZeroNews 通過互聯網訪問 OA 系統的…

Windows 11 安裝使用 nvm,Node.js、npm多版本管理、切換

Windows 11 安裝使用 nvm&#xff0c;Node.js、npm多版本管理、切換 文章目錄Windows 11 安裝使用 nvm&#xff0c;Node.js、npm多版本管理、切換1. nvm 簡介2. 安裝、配置 nvm2.1. 卸載現有 Node.js&#xff08;非常重要&#xff01;&#xff09;2.2. 下載 nvm-windows 安裝包…

在LazyVim中配置Rust開發環境

要在LazyVim中配置Rust開發環境&#xff0c;包括代碼補全、格式化、調試等功能&#xff0c;可以按照以下步驟進行配置&#xff1a; 1. 確保基礎環境 首先確保你已經安裝了&#xff1a; Rust工具鏈 (rustup, rustc, cargo)LazyVim已正確安裝 # 安裝Rust工具鏈 curl --proto http…

LeetCode熱題100--114. 二叉樹展開為鏈表--中等

1. 題目 給你二叉樹的根結點 root &#xff0c;請你將它展開為一個單鏈表&#xff1a; 展開后的單鏈表應該同樣使用 TreeNode &#xff0c;其中 right 子指針指向鏈表中下一個結點&#xff0c;而左子指針始終為null 。展開后的單鏈表應該與二叉樹 先序遍歷 順序相同。 示例 …

REST API 設計最佳實踐指南 - 如何用 JavaScript、Node.js 和 Express.js 構建 REST API

過去幾年里&#xff0c;我創建并使用過很多 API。在此過程中&#xff0c;我遇到過各種好的和壞的實踐&#xff0c;也在開發和調用 API 時碰到過不少棘手的問題&#xff0c;但也有很多順利的時刻。 網上有很多介紹最佳實踐的文章&#xff0c;但在我看來&#xff0c;其中不少都缺…

MyCat

文章目錄18.1 MySQL 讀寫分離概述18.1.1 工作原理18.1.2 為什么要讀寫分離18.1.3 實現方式18.2 什么是 MyCat18.3 MyCat 安裝與配置1. 下載與解壓2. 創建用戶并修改權限3. 目錄說明4. Java 環境要求18.4 MyCat 啟動與配置1. 配置環境變量2. 配置 hosts&#xff08;多節點集群&a…

使用 Spring Boot 搭建和部署 Kafka 消息隊列系統

使用 Spring Boot 搭建和部署 Kafka 消息隊列系統 摘要 本文將引導您在 Kafka 上搭建一個消息隊列系統&#xff0c;并整合到您的 Spring Boot 項目中。我們將逐步實現這一方案&#xff0c;探討其中的關鍵原理&#xff0c;避開可能遇到的坑&#xff0c;并最終將其部署到 Kuberne…

daily notes[45]

文章目錄basic knowledgereferencesbasic knowledge the variable in Rust is not changed. let x5; x6;Rust language promotes the concept that immutable variables are safer than variables in other programming language such as python and and are in favour of th…

技術奇點爆發周:2025 年 9 月科技突破全景掃描

技術奇點爆發周&#xff1a;2025 年 9 月科技突破全景掃描當中國 "祖沖之三號" 量子計算機在特定任務上超越經典超級計算機一千萬億倍的算力新聞&#xff0c;與 OpenAI 宣布 100 億美元定制芯片量產協議的消息在同一周密集爆發時&#xff0c;我們真切感受到了技術革命…

分布式專題——10.3 ShardingSphere實現原理以及內核解析

1 ShardingSphere-JDBC 內核工作原理當往 ShardingSphere 提交一個邏輯SQL后&#xff0c;ShardingSphere 到底做了哪些事情呢&#xff1f;首先要從 ShardingSphere 官方提供的這張整體架構圖說起&#xff1a;1.1 配置管控在 SQL 進入 ShardingSphere 內核處理&#xff08;如解析…

移動語義的里里外外:從 std::move 的幻象到性能的現實

我們都已經聽過這樣的建議&#xff1a;“使用 std::move 來避免昂貴的拷貝&#xff0c;提升性能。” 這沒錯&#xff0c;但如果你對它的理解僅止于此&#xff0c;那么你可能正在黑暗中揮舞著一把利劍&#xff0c;既可能披荊斬棘&#xff0c;也可能傷及自身。 移動語義是 C11 帶…

selenium完整版一覽

selenium 庫驅動瀏覽器selenium庫是一種用于Web應用程序測試的工具,它可以驅動瀏覽器執行特定操作,自動按照腳本代碼做出單擊、輸入、打開、驗證等操作,支持的瀏覽器包括IE、Firefox、Safari、Chrome、Opera等。而在辦公領域中如果經常需要使用瀏覽器操作某些內容,就可以使用se…

[Linux]學習筆記系列 -- lib/kfifo.c 內核FIFO實現(Kernel FIFO Implementation) 高效的無鎖字節流緩沖區

文章目錄lib/kfifo.c 內核FIFO實現(Kernel FIFO Implementation) 高效的無鎖字節流緩沖區歷史與背景這項技術是為了解決什么特定問題而誕生的&#xff1f;它的發展經歷了哪些重要的里程碑或版本迭代&#xff1f;目前該技術的社區活躍度和主流應用情況如何&#xff1f;核心原理與…

MFC_Install_Create

1. 安裝MFC 編寫MFC窗口應用程序需要用到Visual Studiohttps://visualstudio.microsoft.com/zh-hans/&#xff0c;然后安裝&#xff0c;要選擇使用C的桌面開發&#xff0c;再點擊右邊安裝詳細信息中的使用C的桌面開發&#xff0c;往下滑&#xff0c;有一個適用于最新的v143生成…

Langchain4j開發之AI Service

學習基于Langchain4j的大模型開發需要學習其中Ai Service的開發模式。里面對大模型做了一層封裝&#xff0c;提供一些可以方便調用的api。其中有兩種使用Ai Service的方式。一.編程式開發1.首先引入Langchain4的依賴。<dependency><groupId>dev.langchain4j</gr…

認識神經網絡和深度學習

什么是神經網絡&#xff1f;什么又是深度學習&#xff1f;二者有什么關系&#xff1f;……帶著這些疑問&#xff0c;進入本文的學習。什么是神經網絡神經網絡&#xff08;Neural Network&#xff09;是一種模仿生物神經系統&#xff08;如大腦神經元連接方式&#xff09;設計的…

醫療行業安全合規數據管理平臺:構建高效協作與集中化知識沉淀的一體化解決方案

在醫療行業中&#xff0c;數據不僅是日常運營的基礎&#xff0c;更是患者安全、服務質量和合規管理的核心載體。隨著醫療業務的復雜化和服務模式的多元化&#xff0c;各類機構——從大型醫院到科研中心——都面臨著海量文檔、報告、影像資料和政策文件的管理需求。這些資料往往…

Day25_【深度學習(3)—PyTorch使用(5)—張量形狀操作】

reshape() squeeze()unsqueeze()transpose()permute()view() reshape() contiguous() reshape() 一、reshape() 函數保證張量數據不變的前提下改變數據的維度&#xff0c;將其轉換成指定的形狀。def reshape_tensor():data torch.tensor([[1, 2, 3], [4, 5, 6]])print(data…

第十八篇 開發網頁教學:實現畫布、繪畫、簡易 PS 方案

在網頁開發領域&#xff0c;畫布功能是實現交互創作的重要基礎&#xff0c;無論是簡單的繪畫工具&#xff0c;還是具備基礎修圖能力的簡易 PS 方案&#xff0c;都能為用戶帶來豐富的視覺交互體驗。本篇教學將圍繞 “學習 - 實踐 - 實操” 的核心思路&#xff0c;從技術原理講解…

封裝形成用助焊劑:電子制造“隱形橋梁”的技術突圍與全球產業重構

在5G通信、人工智能、新能源汽車等新興技術驅動下&#xff0c;全球電子制造業正以年均6.8%的增速重構產業鏈。作為電子元件焊接的核心輔料&#xff0c;封裝形成用助焊劑&#xff08;又稱電子封裝用助焊劑&#xff09;憑借其“優化焊接質量、提升可靠性、降低制造成本”的核心價…