Linxu自動化構建工具make/Makefile究竟時什么?

Linxu自動化構建工具make/Makefile究竟時什么?

  • 一、簡介
  • 二、makefile文件制作(簡潔版)
    • 2.1 源文件
    • 2.2 makefile如何制作
      • 2.2.1 依賴關系、依賴方法
      • 2.2.3 偽目標(清理文件資源)
  • 三、make/Makefile自動化原理
    • 3.1 偽目標為什么可以重復執行?
    • 3.2 make如何工作?
  • 四、Makefile簡介版本
    • 4.1 版本一
    • 4.2 版本二
    • 4,3 版本三

一、簡介

?在一個大型工程中,源文件不計其數。按照文件類型、功能、模塊不同,放在不同的目錄下。但哪些文件先編譯,哪些文件后編譯,哪些文件需沖重新編譯,甚至更為復雜的功能操作,如果依靠程序員自身來控制,不僅效率低下,而且極其容易出錯!為此,自動化構建工具誕生 —— make/Makefile
?Makefile(或makefile)是一個腳本文件;而make是一個命令工具,用于解釋Makefile中的指令,一般來說,大多數的IDE都有這個命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。當我們在Makefile中一旦寫好了編譯方式,只需要一個make命令就可完成整個工程的自動化編譯。

二、makefile文件制作(簡潔版)

2.1 源文件

這里我們給出一段各位都記憶深刻的代碼:(存在于code.c源文件中)

#include <stdio.h>  int main()  
{  printf("hello world\n");printf("hello world\n");printf("hello world\n");return 0;                                                                                                                                                                          
} 

2.2 makefile如何制作

在工程中,最重要的就是通過源文件通過某種方式來形成可執行文件,以及項目資源的清理。現在的問題是如何通過makefile來達到上述目的呢?
我們只需要在Makefile文件中輸入以下程序即可:(后續還會在修改)

mybin:code.c  #如果有多個源文件,code.c后可繼續田間源文件 gcc code.c -o mybin #前面的空格只能按Tab鍵,不能輸入4個空格(語法)
.PHONY:clean #偽目標                                                                                                                                                                   
clean:                         rm -f mybin

接下來我們來一一分析每段代碼是什么意思,以及如何編寫!

2.2.1 依賴關系、依賴方法

?第一行mybin:code.c 稱為依賴關系冒號左邊為目標文件;冒號左邊為源文件(可以是多個)。
?第二行gcc code.c -o mybin稱為依賴關系,及源文件通過何種方式來形成目標文件。需要特別注意的是:依賴關系前的空格只能通過Tab鍵實現,不可以是4空格或其他!!!

?比如假設我們需要通過main.c、code.c、test.c三個源文件通過gcc來編譯形成mybin目標文件,所以代碼為:

mybin:main.c code.c test.c gcc main.c code.c test.c -o mybin

mybin:main.c code.c test.c gcc -o mybin main.c code.c test.c  //(只需保證-o后緊跟的是目標文件即可)

2.2.3 偽目標(清理文件資源)

在上述代碼中.PHONY:xxx文件名表示該目標文件為偽目標,表示該文件不需要依賴關系,并且總是被執行
現在我們分別運行偽目標文件和普通文件看看會發生什么?

【普通目標文件】:

請添加圖片描述

【偽目標文件】:
請添加圖片描述

?我們發現對于普通目標文件,一旦我們編譯后就不能重復編譯,否則會報make: ‘mybin' is up to date.;但對于偽目標文件來說可以重復執行。
?為什么會這樣呢?

三、make/Makefile自動化原理

3.1 偽目標為什么可以重復執行?

?在解決這個問題之前,我們需要先了解為什么普通目標文件不可以重復執行!

?在實際工程中,一個大型項目存在眾多的源文件,我們需要對這些源文件進行編譯形成可執行文件。但一旦編譯好后,在下一次執行該文件時,我們只需要重新編譯某些內容被修改過的源文件即可。如果每次執行都需要重新編譯所有的源文件,不僅意義不大,還會導致效率大大降低!

?那程序如何發現代碼別修改過,需要重新編譯了?

?在Linux中,每個文件有3種時間:Access、Modify、change三種時間,分別代表文件被打開的時間、文件內容內修改的時間、文件屬性被修改的時間。我們可以通過stat 文件名來查看文件的3種時間。
?其中,Access時間比較特殊。一般而言,一個文件被訪問是非常頻繁的。由于文件存在磁盤中,如果每次進入文件都修改文件的Access時間,這也意味著存在大量的訪問磁盤的IO操作,變形的降低了操作系統的效率。為此,當代計算機一般都對更改Access時間做了次數限制,不同機器平臺存在差異。只有達到一定次數時,才會修改Access時間
?由于我們最終目的是得到相應的可執行程序,所以我們可以通過對比源文件和可執行文件的Modify來判斷哪些文件被修改過,需要重新編譯。即源文件第一次形成可執行文件時,可執行文件的Modify > 源文件的Modify。一旦源文件內容被修改后,此時源文件Modify被修改為最新時間,此時源文件Modify > 可執行文件的Modify。而make如果識別到源文件Modify > 可執行文件的Modify,便會對源文件進行重新編譯。

偽目標為什么可以重復執行?
?前面博主替代過,一旦文件通過.PHONY:文件名成為偽目標,此時該文件不在需要依賴關系。這也意味這該文件不需要對比任何時間,直接執行。即可以重復執行。

3.2 make如何工作?

?在默認情況下,只要我們輸入make命令,此時make會在當前目錄下查找名為Makefile或makefile的文件。如果找到,則它會將第一個目標文件作為最終的目標文件。
?如果第一個目標文件文件不存在,或是第一個目標文件所依賴的后面的 .o 文件的文件修改時間要比第一個目標文件新,那么,他就會執行后面所定義的命令來生成這個文件。如果第一個目標文件所依賴的.o文件也不存在,那么make會在當前文件中找目標為.o文件的依賴性,如果找到則再根據那一個規則生成.o文件。
?這就是整個make的依賴性,make會一層又一層地去找文件的依賴關系,直到最終編譯出第一個目標文件。在找尋的過程中,如果出現錯誤,比如最后被依賴的文件找不到,那么make就會直接退出,并報錯,而對于所定義的命令的錯誤,或是編譯不成功,make根本不理。make只管文件的依賴性,即,如果在找了依賴關系之后,冒號后面的文件還是不在,那么就不工作了。

四、Makefile簡介版本

比如假設我們需要通過main.c、code.c、test.c三個源文件通過gcc來編譯形成mybin目標文件,這里有3個版本。各位自行選擇。

4.1 版本一

這個就是最簡單版本,就不多說了。

mybin:code.c  gcc main.c、code.c、test.c -o mybin #前面的空格只能按Tab鍵,不能輸入4個空格(語法)
.PHONY:clean #偽目標                                                                                                                                                                   
clean:                         rm -f main.c、code.c、test.c

4.2 版本二

在Makefile中,我們可以在指令前加上@符號,可以不在顯示屏上回顯文件執行的指令。同時$@表示冒號左邊的目標文件,$^來表示冒號右邊的所有源文件。
所以上述代碼可修改如下:

mybin:main.c、code.c、test.c gcc &^ -o $@ #前面的空格只能按Tab鍵,不能輸入4個空格(語法)
.PHONY:clean #偽目標                                                                                                                                                                   
clean:                         rm -f target

4,3 版本三

在make/Makefile中,支持變量化處理。有點類似于宏替換,具體如下:

cc=gcc
target=mybin.exe
src=main.c code.c test.c
#使用上述變量時,我們僅需通過$(變量)即可使用$(target):$(src)  $(cc) &^ -o $@ #前面的空格只能按Tab鍵,不能輸入4個空格(語法)
.PHONY:clean #偽目標                                                                                                                                                                   
clean:                         rm -f target

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

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

相關文章

SpringBoot+Vue實現el-table表頭篩選排序(附源碼)

&#x1f468;?&#x1f4bb;作者簡介&#xff1a;在笑大學牲 &#x1f39f;?個人主頁&#xff1a;無所謂^_^ ps&#xff1a;點贊是免費的&#xff0c;卻可以讓寫博客的作者開心好幾天&#x1f60e; 前言 后臺系統對table組件的需求是最常見的&#xff0c;不過element-ui的el…

Grpc項目集成到java方式調用實踐

背景&#xff1a;由于項目要對接到grcp 的框架&#xff0c;然后需要對接老外的東西&#xff0c;還有簽名和證書剛開始沒有接觸其實有點懵逼。 gRPC 是由 Google 開發的高性能、開源的遠程過程調用&#xff08;RPC&#xff09;框架。它建立在 HTTP/2 協議之上&#xff0c;使用 …

D7805 正電壓穩壓電路應用——體積小,成本低,性能好

D7805 構成的 5V 穩壓電源為輸出電壓5V&#xff0c;輸出電流 1000mA 的穩壓電源它由濾波電容 C1,C3,防止自激電容 C2、C3 和一只固定三端穩壓器&#xff08;7805&#xff09;后級加 LC 濾波極為簡潔方便地搭成&#xff0c;輸入直流電壓范圍為 7~35V&#xff0c;此直流電壓經過D…

yolov8-更換卷積模塊-ContextGuidedBlock_Down

源碼解讀 class ContextGuidedBlock_Down(nn.Module):"""the size of feature map divided 2, (H,W,C)---->(H/2, W/2, 2C)"""def __init__(self, nIn, dilation_rate2, reduction16):"""args:nIn: the channel of input fea…

Hack The Box-Bizness

目錄 信息收集 nmap dirsearch WEB Get shell 提權 get user flag get root flag 信息收集 nmap 端口掃描┌──(root?ru)-[~/kali/hackthebox] └─# nmap -p- 10.10.11.252 --min-rate 10000 -oA port Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-03-04 1…

實測VLLM的加速效果

為了測試vllm的并行加速效果&#xff0c;采用同樣的5個提問&#xff0c;編寫兩個不同的python腳本&#xff0c;分別是compare_vllm.py和compare_chatglm3.py&#xff0c;其中compare_vllm.py采用vllm加速。 服務器參數&#xff1a; 操作系統ubuntu 22.04CPUi7 14700k內存dd5 …

hive中常見參數優化總結

1.with as 的cte優化&#xff0c;一般開發中習慣使用with as方便閱讀&#xff0c;但如果子查詢結果在下游被多次引用&#xff0c;可以使用一定的參數優化手段減少表掃描次數 默認set hive.optimize.cte.materialize.threshold-1;不自動物化到內存&#xff0c;一般可以設置為 se…

力扣 第 387 場周賽 解題報告 | 珂學家 | 離散化樹狀數組 + 模擬場

前言 整體評價 手速場模擬場&#xff0c;思路和解法都蠻直接的。 所以搞點活 如果T2&#xff0c;如果不固定左上角&#xff0c;批量查詢某個點為左上角&#xff0c;求滿足總和 ≤ k \le k ≤k的子矩陣個數 如果T2&#xff0c;如果不固定左上角&#xff0c;求總和 ≤ k \le k…

Spring的Bean的生命周期 | 有圖有案例

Spring的Bean的生命周期 Spring的Bean的生命周期整體過程實例化初始化服務銷毀循環依賴問題 完整生命周期演示 Spring的Bean的生命周期 Spring Bean的生命周期&#xff1a;從Bean的實例化之后&#xff0c;通過反射創建出對象之后&#xff0c;到Bean稱為一個完整的對象&#xf…

EXPLAIN:mysql 執行計劃分析詳解

目錄 EXPLAIN命令 查看執行計劃 分析執行計劃 優化查詢 EXPLAIN中的 type 列類型 在MySQL中&#xff0c;你可以使用EXPLAIN命令來生成查詢的執行計劃。EXPLAIN命令可以顯示MySQL如何使用鍵來處理SELECT和DELETE語句&#xff0c;以及INSERT或UPDATE語句的WHERE子句。這對于…

SRS Stack提供的鑒權、私人直播間、多平臺轉播、錄制等高級功能的具體使用方法是什么?

SRS Stack提供的鑒權、私人直播間、多平臺轉播、錄制等高級功能的具體使用方法是什么&#xff1f; 鑒權功能&#xff1a;SRS Stack支持通過系統配置中的OpenAPI獲取Bearer鑒權&#xff0c;并可以嘗試HTTP API。用戶可以通過點擊網頁上的按鈕請求HTTP API&#xff0c;或者使用cu…

快上車:什么是人工智能?人工智能和普通程序的區別

什么是人工智能&#xff1f; 雖然AI歷史很悠久&#xff0c;上個世紀50年代就有各種概念&#xff0c;但是發展很慢。第一次對人類的沖擊就是1997年IBM深藍擊敗國際象棋世界冠軍&#xff0c;引起了人們的廣泛關注&#xff0c;之后又銷聲匿跡。突然間2016人工智能alphaGO戰勝了圍…

具身智能計算系統,機器人時代的 Android | 新程序員

【導讀】具身智能作為一種新興的研究視角和方法論&#xff0c;正在刷新我們對智能本質及其發展的理解&#xff1a;傳統的 AI 模型往往將智能視為一種獨立于實體存在的抽象能力&#xff0c;而具身智能則主張智能是實體與其環境持續互動的結果。 本文深度剖析了具身智能計算系統…

【CSS】初學了解Grid布局

目錄 什么是Grid布局如何開始使用Grid布局Grid容器的屬性Grid項目的屬性舉個例子 什么是Grid布局 Grid布局是一種二維的布局系統&#xff0c;它允許我們在水平和垂直方向上同時控制網格中的項目位置。通過將頁面劃分為行和列&#xff0c;我們可以輕松地創建出復雜的布局結構&a…

程序員如何選擇職業賽道?

一、自我評估與興趣探索 程序員選擇職業賽道時&#xff0c;可以考慮以下幾個關鍵因素&#xff1a; 1、興趣與熱情&#xff1a;首先要考慮自己的興趣和熱情&#xff0c;選擇符合個人喜好和激情的領域&#xff0c;能夠激勵自己持續學習和進步。 2、技術能力&am…

2.python72變筆記(自用未修改版)

以前寫的python筆記 1.二進制與字符編碼 #8bit&#xff08;位&#xff09;1byte&#xff08;字節&#xff09; #1024byte 1KB 千字節 #1024KB 1MB 兆字節 #1024MB 1TB 太字節 print(chr(0b100111001010000)) print(ord("陳")) #ord 十進制 #無論英語還是漢語在計算…

mysql5.7配置主從

原理&#xff1a; MySQL主從復制的工作原理如下:1. 主服務器產生Binlog日志當主服務器的數據庫發生數據修改操作時,如INSERT、UPDATE、DELETE語句執行,主服務器會記錄這些操作的日志信息到二進制日志文件中。2. 從服務器讀取Binlog日志 從服務器會向主服務器發送請求,主服務器把…

微信小程序開發學習筆記《18》uni-app框架-網絡請求與輪播圖

微信小程序開發學習筆記《18》uni-app框架-網絡請求 博主正在學習微信小程序開發&#xff0c;希望記錄自己學習過程同時與廣大網友共同學習討論。建議仔細閱讀uni-app對應官方文檔 一、下載網絡請求包 這個包是以前黑馬程序員老師寫的一個包&#xff0c;跟著課程學習&#x…

Open3D(C++) 指定點數的體素濾波

目錄 一、算法原理1、算法過程2、參考文獻二、代碼實現三、結果展示本文由CSDN點云俠原創,原文鏈接。如果你不是在點云俠的博客中看到該文章,那么此處便是不要臉的爬蟲與GPT。 一、算法原理 1、算法過程 對于數據量較大的點云,在后期進行配準時會影響計算效率。而體素格網…

vue3ts websocket通信

前端&#xff1a;vue3ts 后端&#xff1a;springboot npm安裝依賴 cnpm install sockjs-client stompjs 前端代碼 <template><div><el-input v-model"message" type"text" placeholder"發送" /><el-button-group><…