【Linux系統編程】項目自動化構建工具make/Makefile

介紹:

? ? ? ??make和Makefile是用于編譯和構建C/C++程序的工具和文件。Makefile是一個文本文件,其中包含了編譯和構建程序所需的規則和指令。它告訴make工具如何根據源代碼文件生成可執行文件,里面保存的是依賴關系依賴方法。make是一個命令行工具,用于根據Makefile文件中定義的依賴關系依賴方法來生成程序。

make/Makefile的使用:

? ? ? ? 在使用此構建工具時,首先,我們要建立一個名稱為 Makefilemakefile 文件,這里要注意 的是名稱是固定的,不可更改。建立之后就要進入vim編輯步驟,輸入依賴關系依賴方法來對指定程序進行指令控制。

? ? ? ? 下面,我們使用最簡單的gcc編譯操作來對C語言源文件程序進行控制。

[zhu@zhujunhao ~]$ vim Makefile
[zhu@zhujunhao ~]$ cat Makefile
code.exe:code.c? ? ? ?#第一行叫做依賴關系,即對文件code.c進行操作
?? ?gcc code.c -o code.exe? ?#第二行叫做依賴方法,該方法對code.c文件進行編譯
[zhu@zhujunhao ~]$ make? #直接make,開始執行Makefile文件中指令
gcc code.c -o code.exe? ?#Makefile 的依賴方法操作
[zhu@zhujunhao ~]$ ll
total 24
-rw-rw-r-- 1 zhu zhu ?181 Dec ?7 09:15 code.c
-rwxrwxr-x 1 zhu zhu 8360 Dec ?7 17:02 code.exe? ?#make形成可執行文件code.exe
-rw-rw-r-- 1 zhu zhu ?827 Dec ?5 14:52 install.sh
-rw-rw-r-- 1 zhu zhu ? 40 Dec ?7 17:01 Makefile

? ? ??其中,依賴關系是所要針對的文件,上面依賴關系?code.exe:code.c 中的 mybin 叫做目標文件,make 操作的就是此文件,code.c?叫做依賴文件列表,兩者之間用 “ :?” 分割。依賴方法是要對此文件進行指令操作,上面的依賴方法?gcc code.c -o code.exe 是對code.c文件進行編譯處理。

? ? ? ? 這里要注意的是,當我們使用make后,就不能再次使用make對其進行編輯。這時我們需在Makefile文件中對相關東西進行清理工作。如下:

[zhu@zhujunhao ~]$ vim Makefile
[zhu@zhujunhao ~]$ cat Makefile
clear:? ? ? ? ? ? ? ? ? ? ? ? ? ?#定義clear的依賴關系
?? ?rm -f code.exe? ?? ? ?#clear對應的依賴方法
code.exe:code.c? ? ? ? #定義目標文件code.exe依賴關系
?? ?gcc code.c -o code.exe? ? ? ?#code.exe的依賴方法
[zhu@zhujunhao ~]$ make? ? ?#默認執行第一個依賴關系所對應的依賴方法
rm -f code.exe
[zhu@zhujunhao ~]$ ll
total 12
-rw-rw-r-- 1 zhu zhu 181 Dec ?7 09:15 code.c
-rw-rw-r-- 1 zhu zhu 827 Dec ?5 14:52 install.sh
-rw-rw-r-- 1 zhu zhu ?65 Dec ?7 18:04 Makefile

[zhu@zhujunhao ~]$ make code.exe? ? ?#進行說明執行第二個依賴關系所對應的依賴方法
gcc code.c -o code.exe
[zhu@zhujunhao ~]$ ll
total 24
-rw-rw-r-- 1 zhu zhu ?181 Dec ?7 09:15 code.c
-rwxrwxr-x 1 zhu zhu 8360 Dec ?7 18:05 code.exe
-rw-rw-r-- 1 zhu zhu ?827 Dec ?5 14:52 install.sh
-rw-rw-r-- 1 zhu zhu ? 65 Dec ?7 18:04 Makefile

? ? ? ? 這里需注意,Makefile 定義的依賴關系中的 “目標文件” 不一定非要是文件,主要作用在于依賴方法,比如上面的?clear?功能就是刪除文件操作。這里的 “目標文件” 是一個抽象的概念。

? ? ? ? Makefile和make 形成目標文件的時候,默認是從上到下掃描Makefile文件的,若不加以說明,默認形成的是第一個目標文件。

? ? ? ? 上面說到 make 只能編譯一次。但是我們發現,當修改源文件時,可再次進行 make 編輯,這是因為make會根據文件所對應時間的修改而再次進行編輯。使用 stat [文件或目錄] 可查看【文件或目錄i】所對應的詳細時間記錄。

[zhu@zhujunhao ~]$ stat code.c? ? ? ? ?#查看code.c文件所對應的時間記錄
? File: ‘code.c’
? Size: 181 ? ? ? ?? ?Blocks: 8 ? ? ? ? ?IO Block: 4096 ? regular file
Device: fd01h/64769d?? ?Inode: 1052177 ? ? Links: 1
Access: (0664/-rw-rw-r--) ?Uid: ( 1001/ ? ? zhu) ? Gid: ( 1001/ ? ? zhu)
Access: 2023-12-07 09:15:21.064989027 +0800
Modify: 2023-12-07 09:15:21.060988852 +0800
Change: 2023-12-07 09:15:21.060988852 +0800
?Birth: -

? ? ? ? 這里,所對應的時間為Access、Modify、Change三個記錄。其中,Access是最近一次對文件進行訪問(即讀文件)的時間,Modify是最近一次對文件內容進行修改的時間,Change是最近一次對文件屬性進行修改的時間。要注意的是Access所對應的文件訪問的時間不是每次訪問都會更新,在短時間內頻繁的訪問系統不會更新。這樣保證了不會對系統帶來太大的負擔。

文件時間:

? ? ? ? make編輯文件時查看文件所對應的時間查看的是Modify所對應的時間,也就是說只要Modify所對應的時間被修改,make即可再次進行編輯。這里,我們可使用 touch [文件] 指令,當不存在【文件】時將會創建文件,當存在【文件】時將會全部更新文件所對應的時間。

Makefile/makefile語法使用:? ? ? ?

1,.PHONY的使用

????????當我們不想改變文件所對應的時間時進行連續編譯,這時需要在Makefile/makefile文件中進行.PHONY修飾偽目標。

[zhu@zhujunhao ~]$ vim Makefile
[zhu@zhujunhao ~]$ cat Makefile
.PHONY:code.exe ? ?#修飾code.exe目標文件,成為一個偽目標,使其總是可以被執行
clean:? ? ? ? ? ? ? ? ? ? ? #我們也可用.PHONY修飾clean目標,即.PHONY:clean,使其總是執行
?? ?rm -f code.exe
code.exe:code.c ?
?? ?gcc code.c -o code.exe
[zhu@zhujunhao ~]$ make code.exe
gcc code.c -o code.exe
[zhu@zhujunhao ~]$ make code.exe
gcc code.c -o code.exe
[zhu@zhujunhao ~]$ make code.exe
gcc code.c -o code.exe

2,名稱的替換

????????在Makefile/makefile文件中可用 “ = ” 進行名稱替換工作,使用別名時只需用 $(別名) 進行替換即可,如下:

#使用 = 進行名稱的替換
? ?g=gcc
? ?o=-o
? ?c=code.c
? ?exe=code.exe

#使用別名替換,即:$(別名)
? ?.PHONY:$(exe) ? ?#修飾code.exe目標文件,成為一個偽目標,使其總是可以被執行
? ?clean:
? ? ? ?rm -f $(exe)
? ?$(exe):$(c) ?
??? ? ?gcc $^ $(o) $@ ? # $@代表目標文件,$^代表依賴文件列表 ? ??

3,語法推導

? ? ? ? 在Makefile/makefile中,若存在多個依賴關系,當make運行其中一個依賴關系的依賴方法時,系統會先判斷依賴關系中對應的依賴文件列表,并且對應的依賴文件不存在時,將會自動往下繼續尋找,直到找到指定的命令來生成這個目標文件,若找不到,系統將會報出異常;若找到了,系統將會往上不斷返回執行對應的指令,以便生成這個目標文件。如下:

[zhu@zhujunhao ~]$ vim makefile
[zhu@zhujunhao ~]$ cat makefile
code.exe:code.o
?? ?gcc $^ -o $@
code.o:code.s
?? ?gcc -c $^ -o $@
code.s:code.i
?? ?gcc -S $^ -o $@
code.i:code.c
?? ?gcc -E $^ -o $@

以上的makefile的工作流程是這樣的:

  1. 首先,當你運行?make code.exe時,make會檢查?code.exe是否已經存在。如果存在,make就不會重新編譯。如果不存在,make會找到它的依賴文件code.o,若依賴文件code.o 不存在,系統將往下查找,運行指定的命令來生成這個目標文件。這個過程會一直繼續,直到所有的目標文件都被生成。
  2. 然后,對于每個目標文件,makefile都會檢查是否所有的依賴文件都已經被更新。如果是,那么目標文件就會被重新編譯。這個過程會一直繼續,直到所有的目標文件都被更新。?如果命令失敗了或全部指令運行完之后目標文件還沒有被更新,make會停止并顯示錯誤信息。

? ? ? ?總的來說,makefile定義了如何將C語言源代碼code.c編譯成可執行文件code.exe的過程。在編譯過程中,它首先將C語言源代碼預處理為中間文件code.i,然后將中間文件編譯為匯編文件code.s,接著將匯編文件code.s編譯成二進制文件code.o,最后將二進制文件鏈接為可執行文件code.exe。

[zhu@zhujunhao ~]$ make
gcc -E code.c -o code.i
gcc -S code.i -o code.s
gcc -c code.s -o code.o
gcc code.o -o code.exe

? ? ? ? 可看出,Makefile/makefile的程序指令運行中,依賴關系如同棧結構中不斷推導進棧,當查找到最終所以屬的目標文件時,依賴關系中對應的依賴方法將會不斷的出棧運行。這種形式就叫做makefile/Makefile的語法推到過程。

總:使用make和Makefile/makefile可以簡化編譯和構建程序的過程,只需要編寫一個簡單的Makefile/makefile文件,就可以自動化地編譯和鏈接程序。同時,Makefile/makefile還可以在不同的平臺上使用,使得程序的構建更加靈活和可移植。

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

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

相關文章

智匯恒星科技|控樂屋.全宅智能冠軍代言來啦, 智慧家居千億藍海

隨著5G、大數據、云計算、物聯網等技術的發展,智能化正覆蓋人們生活的方方面面,全屋智能的出現為“一鍵式”智能家居生活享受提供無限可能。近年來智能家居行業總體規模增長迅速,數據顯示,2022年中國智能家居行業市場規模約為6200…

Java內部類

文章目錄 什么是 Java 中的內部類?有哪些類型的內部類?匿名內部類局部內部類(定義在方法中的類)局部內部類靜態內部類 Java 類中不僅可以定義變量和方法,還可以定義類,這樣定義在類內部的類就被稱為內部類。…

Java期末復習題之封裝

點擊返回標題->23年Java期末復習-CSDN博客 第1題. 定義一個類Person,定義name和age私有屬性,定義有參的構造方法對name和age進行初始化。在測試類中創建該類的2個對象,姓名、年齡分別為lili、19和lucy、20,在屏幕打印出2個對象的姓名和年齡…

2024年江蘇省職業院校技能大賽信息安全管理與評估 理論題(樣卷)

2024年江蘇省職業院校技能大賽信息安全管理與評估 理論題(樣卷) 理論技能與職業素養(100分) 2024年江蘇省職業院校技能大賽(高職學生組) 模塊三“信息安全管理與評估”理論技能 【注意事項】 Geek極安云…

Qt對excel操作

Qt庫中自帶對excel操作的模塊QAxObject,QAxObject是Qt提供給程序員從代碼中訪問Office的對象類,其本質上是一個面向微軟操作系統的COM接口。 QAxObject將所有Office的工作簿、表格、文檔等都作為其子對象,程序員通過調用querySubObject()這個…

vue-quill-editor上傳圖片base64轉化為img標簽

vue-quill-editor傳圖片的話默認把圖片轉成了base64&#xff0c;會導致我們的參數特別大&#xff0c;不好渲染 基于vue-quill-editor重寫一個quill-editor組件 <template><div><quilleditorv-model"content"ref"myTextEditor":options&qu…

在線圖片轉Base64圖片的方法

html版(不包含跨域解決,輸入在線圖片地址即可轉換) <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>…

Cisco 思科路由交換網絡設備 安全基線 安全加固操作

目錄 賬號管理、認證授權 本機認證和授權ELK-Cisco-01-01-01 設置特權口令 ELK-Cisco-01-02-01 ELK-Cisco-01-02-02 ???????登錄要求 ELK-Cisco-01-03-01 ???????ELK-Cisco-01-03-02 ELK-Cisco-01-03-03 日志配置 ELK-Cisco-02-01-01 通信協議 ELK-Cisco-…

軟考高級信息系統項目管理師經驗分享

考了三次終于考過了。 第一次&#xff0c;沒準備&#xff0c;打醬油。 第二次&#xff0c;不舍得花錢&#xff0c;自己復習&#xff0c;結果教材改版了都不知道。 第三次&#xff0c;改機考了。 總結一下這三次的經驗&#xff1a; 一、不是學霸型的一定要報班 報班的優點&…

實時動作識別學習筆記

目錄 yowo v2 yowof 判斷是在干什么,不能獲取細節信息 yowo v2 https://github.com/yjh0410/YOWOv2/blob/master/README_CN.md ModelClipmAPFPSweightYOWOv2-Nano1612.640ckptYOWOv2-Tiny

【prometheus】入門+實習需求實戰

prometheus官方教程 說明&#xff1a; 感冒了&#xff0c;寫點總結不浪費時間&#xff0c;聲明不會扯出來任何的私有代碼&#xff0c;畢竟要保密&#xff0c;只會講prometheus的官方有的&#xff0c;以及那些開源的代碼方法&#xff0c;例如prometheus客戶端代方法&#xff0…

QML中Dialog獲取close與open狀態

1.新建MyDialog.qml import QtQuick 2.15import QtQuick.Dialogs 1.2Dialog {id: rootvisible: falsetitle: qsTr("彈出對話框")width: 250height: 200} 2.main.qml中調用MyDialog import QtQuick 2.15 import QtQuick.Window 2.15 import QtQuick.Controls 2.15…

JS原生實現瀏覽器滾動條滾動側邊欄高亮響應

目錄 演示 ?編輯 需求 代碼 css html script 代碼解釋 1、獲取所有link-content 2、定義一個rectContent數組&#xff0c;然后循環allContents調用getClientRects()[0]獲取每個link-content元素與瀏覽器視口的關系 3、為數組追加link-content&#xff0c;用于設置側…

軟件設計師——面向對象技術(一)

&#x1f4d1;前言 本文主要是【面向對象技術】——軟件設計師—面向對象技術的文章&#xff0c;如果有什么需要改進的地方還請大佬指出?? &#x1f3ac;作者簡介&#xff1a;大家好&#xff0c;我是聽風與他&#x1f947; ??博客首頁&#xff1a;CSDN主頁聽風與他 &#…

C++學習筆記(十一)

一、類和對象 C面向對象的三大特性為&#xff1a;封裝、繼承、多態 C認為萬事萬物皆為對象&#xff0c;對象上有其屬性和行為 例如&#xff1a;人可以作為對象&#xff0c;屬性有姓名、年齡、身高......&#xff0c;行為有走、吃、睡覺 車也可以作為對象&#xff0c;屬性有輪…

官網IDM下載和安裝的詳細步驟

目錄 一、IDM是什么 二、下載安裝 三、解決下載超時的問題 四、谷歌瀏覽器打開IDM插件 谷歌瀏覽器下載官網&#x1f447; 五、測試 六、資源包獲取 一、IDM是什么 IDM&#xff08;internet download manager&#xff09;是一個互聯網下載工具插件&#xff0c;常見于用…

要求CHATGPT高質量回答的藝術:提示工程技術的完整指南—第 29 章:ChatGPT 插件

要求CHATGPT高質量回答的藝術&#xff1a;提示工程技術的完整指南—第 29 章&#xff1a;ChatGPT 插件 這是 ChatGPT 的另一個圣杯。它將徹底改變你使用 ChatGPT 的方式。ChatGPT 插件本質上是將 ChatGPT 的功能擴展到文本輸出之外。它允許你上傳圖片、視頻、音頻和 CSV 文件&…

資深IT經理分享如何選擇商用遠控軟件三:評估產品方案匹配度

作為企業必要的IT管理和遠程辦公工具&#xff0c;遠程控制解決方案的挑選和采購是需要IT部門慎重考慮的。 對于具體如何在諸多產品中選擇合適的商用遠程控制解決方案&#xff0c;此前我們就分享了一位資深IT經理的相關經驗&#xff0c;目前已經涵蓋初期的業務需求調研&#xf…

【ESP32 IDF】ESP32移植u8g2庫,實現oled界面顯示

ESP32移植u8g2庫&#xff0c;實現oled界面顯示 1. 簡單描述2. 環境準備1. 硬件準備2. 軟件準備 3. IIC屏幕 【基于 ssd1362 256*64 】4. SPI屏幕 【基于 ssd1306 128*32】 1. 簡單描述 開發方式為 IDF5.0參考連接為 iic基于esp-idf移植使用u8g2 spi基于esp-idf移植使用u8g2 …

探索創意無限的Photoshop CC 2020Mac/Win版

作為一款功能強大的圖像處理軟件&#xff0c;Photoshop CC 2020&#xff08;簡稱PS 2020&#xff09;在全球范圍內備受設計師、攝影師和藝術家的喜愛和推崇。它不僅為用戶提供了豐富多樣的工具和功能&#xff0c;還不斷推出新的創意特效和改進的功能&#xff0c;讓用戶的創意無…