Linux課程四課---Linux開發環境的使用(自動化構建工具-make/Makefile的相關)

作者前言

🎂 ??????🍧🍧🍧🍧🍧🍧🍧🎂
?🎂 作者介紹: 🎂🎂
🎂 🎉🎉🎉🎉🎉🎉🎉 🎂
🎂作者id:老秦包你會, 🎂
簡單介紹:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂
喜歡學習C語言、C++和python等編程語言,是一位愛分享的博主,有興趣的小可愛可以來互討 🎂🎂🎂🎂🎂🎂🎂🎂
🎂個人主頁::小小頁面🎂
🎂gitee頁面:秦大大🎂
🎂🎂🎂🎂🎂🎂🎂🎂
🎂 一個愛分享的小博主 歡迎小可愛們前來借鑒🎂


make/makefile

  • **作者前言**
  • 簡單的認識
  • 依賴關系和依賴方法
    • make工作原理
    • make無法進行多次編譯的原因
    • .PHONY偽目標
    • 特殊符號

簡單的認識

make是一個指令
makefile是一個文件(保存的是依賴關系依賴方法)
第一步
命名一定是makefile或者Makefile,不能改變
第二步
往該文件寫入一些代碼

 mybin:Newcode1.c                                                                                                                                                                                              gcc -o New.out Newcode1.c

第三步
使用命令

make

在這里插入圖片描述
出現的內容和自己寫入的沒有區別就算成功了

依賴關系和依賴方法

我們打開makefile進行寫入一些代碼
在這里插入圖片描述
我們可以想象一下, 我們打電話回家要生活費的時候說:老爸,我是你兒子,我要生活費
這里我們可以把依賴關系比作老爸和兒子的關系以及 我要生活費是依賴方法

mybin : Newcode.c 其中mybin就是目標文件, Newcode.c就是依賴文件列表
在這里插入圖片描述
依賴關系可以有多個,但是需要空格分開
只要我們把目標文件運行出來且是最新的,make指令就不會運行
在這里插入圖片描述
我們還可以添加一些代碼
在這里插入圖片描述
增加clean這個,這個clean是一個依賴關系,我們也可以換成其他依賴關系,
運行

make clean

在這里插入圖片描述
就會刪除對應的文件,
如果我們把這些代碼調換一下位置,就會發現
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

直接運行make就會直接執行rm New這個方法,
表面,makefile和make形成目標文件的時候.默認是從上到下掃描makefile文件,默認形成的是第一個目標文件(makefile里面的目標文件)

make工作原理

1.我們輸入make指令,make會在當前目錄下找到"makefile"或者"Makefile"文件
2. 如果找到,它會找文件中的第一個目標文件(target),在上面的例子中,他會找到“New”這個文件,并把這個文件作為最終的目標文件。
3. 如果New文件不存在,或是New所依賴的后面的Newcode1.c文件的文件修改時間要比new這個文件新(可以用 touch 測試),那么,他就會執行后面所定義的命令來生成hello這個文件。
4. 如果New所依賴的Newcode1.o文件不存在,那么make會在當前文件中找目標為Newcode1.o文件的依賴性,如果找到則再根據那一個規則生成Newcode1.o文件。(這有點像一個堆棧的過程)
例如:
在這里插入圖片描述
在makefile文件中,我只是寫有依賴關系和依賴方法,和當前目錄只有.c文件,當我們使用make New這個命令事就會運行出下面的結果
在這里插入圖片描述
也就是說,如果依賴關系列表里面的文件不存在,就會繼續往后進行依賴,找到了就會往返,不會執行其他多余的代碼

  1. 當然,你的C文件和H文件是存在的啦,于是make會生成 Newcode1.o 文件,然后再用 Newcode1.o 文件聲明make的終極任務,也就是執行文件New了。
  2. 這就是整個make的依賴性,make會一層又一層地去找文件的依賴關系,直到最終編譯出第一個目標文
    件。
  3. 在找尋的過程中,如果出現錯誤,比如最后被依賴的文件找不到,那么make就會直接退出,并報錯,而對于所定義的命令的錯誤,或是編譯不成功,make根本不理。
  4. make只管文件的依賴性,即,如果在我找了依賴關系之后,冒號后面的文件還是不在,那么對不起,我就不工作啦。

make無法進行多次編譯的原因

如果我們進行多次make 或者其他的指令就會發現
在這里插入圖片描述
出現這個問題,是啥導致的呢?
其實就是make指令是根據目標文件的最新修改時間和依賴文件最新修改時間來對比,來判斷是否需要進行再次編譯的,如果依賴文件的最新修改時間比目標文件的最新修改時間還要新,就會再次編譯,
我們可以使用下面指令,查看文件的最新更新時間

stat New
stat Newcode1.o

在這里插入圖片描述
圖中就可以看出依賴文件的最新時間比目標文件的最新時間要舊,所以就不會再次編譯
時間有三部分:
Access:文件的訪問時間
Modify:文件內容更改的最新時間
Change:文件屬性的最新更改時間
如圖:
在這里插入圖片描述
我們改變文件內容,就會帶動著文件屬性(文件的大小)和內容的時間進行改變,
而我們改變文件屬性,文件屬性的時間也會跟著改變.

有些小可愛已經發現了Access的時間的改變有點不正常,有時候會改變,有時候不改變
是由于歷史的原因,早前的Linux由于文件的訪問非常的頻繁,Access更新頻繁,導致了運行速度下降了,為了解決這個問題,當文件訪問一定次數或者進行系統更新操作,才會進行Access的時間進行更新,
可以想出來,make是否編譯很大可能就是取決于Modify是否發生改變

更改文件時間

touch Newcode.c# 文件不存在創建,存在就會更新時間touch -m Newcode.c:#將Newcode.c文件的Modify時間更至最新。
touch -a Newcode.c:#將Newcode.c文件的Access時間更至最新。
touch -c Newcode.c:#將Newcode.c文件的Change時間更至最新。

.PHONY偽目標

在這里插入圖片描述
圖中我們為New這個目標文件添加了這個偽目標,所以以New為目標文件的依賴關系和方法就會被執行,不管該依賴文件的時間是否更新,都會進行編譯
在這里插入圖片描述
這個圖可以發現,.PHONY對哪個目標文件,就會針對哪個文件,不存在遺傳下去,

上面只是演示一下,.PHONY經常用于清除操作
在這里插入圖片描述

特殊符號

我們在寫的過程中會經常重復一些文件名,很麻煩
make就提供了一些符號
$@:代表的目標文件
$^:代表的是依賴文件列表
在這里插入圖片描述
運行結果
在這里插入圖片描述
一樣可以運行出來

定義變量
我們還可以定義一些變量
在這里插入圖片描述
在makefile文件開頭定義一些變量,我們還可以使用文件名來進行定義變量,

在這里插入圖片描述
這樣也可以替代$@和$^

總結
這里的make就講到這里了有不懂的小可愛可以私聊我

?

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

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

相關文章

用Java語言創建的Spring Boot項目中,如何傳遞數組呢??

問題: 用Java語言創建的Spring Boot項目中,如何傳遞數組呢?? 在這個思路中,其實,Java作為一個后端開發的語言,沒必要著重于如何傳入,我們主要做的便是對傳入的數組數據進行處理即可…

解決虛擬機啟動報錯:“End kernel panic - not syncing: attempted to kill the idle task”

原本能正常運行的虛擬機,很長一段時間沒用后,今天再次啟動,然后就出現下面的問題: 然后走了一些彎路,比如說刪除該虛擬機然后新建一個虛擬機(問題未解決)、直接刪除VitualBox重新安裝&#xff0…

感染了后綴為.faust勒索病毒如何應對?數據能夠恢復嗎?

導言: 在網絡安全領域,.faust勒索病毒是近期備受關注的一種惡意軟件。這種病毒采用高度復雜的加密算法,將受感染計算機上的文件全部加密,并要求受害者支付贖金以獲取解密密鑰。.faust勒索病毒的攻擊方式通常是通過電子郵件附件、…

快遞平臺獨立版小程序源碼|帶cps推廣營銷流量主+前端

源碼介紹: 快遞代發快遞代寄寄件小程序可以對接易達云洋一級總代 快遞小程序,接入云洋/易達物流接口,支持選擇快遞公司,三通一達,極兔,德邦等,功能成熟 如何收益: 1.對接第三方平臺成本大約4元…

Python基本數據類型介紹

Python 解釋 Python是一種高級編程語言,以其簡潔、易讀和易用而聞名。它是一種通用的、解釋型的編程語言,適用于廣泛的應用領域,包括軟件開發、數據分析、人工智能等。python是一種解釋型,面向對象、動態數據類型的高級程序設計…

00X集——vba獲取CAD圖中圖元類名objectname

在CAD中,通過快捷鍵PL(即POLYLINE命令)繪制的線屬于AcDbPolyline。AcDbPolyline也被稱為LWPOLYLINE,即簡單Polyline,它所包含的對象在本身內部。 此外,CAD中還有另一種二維多段線對象,稱為AcDb2…

ViewModel 原理

在現代Android應用開發中,ViewModel是架構組件庫的一個關鍵部分,它在提高應用的穩定性和性能方面發揮著重要作用。在這篇文章中,我們將深入探討ViewModel的工作原理和最佳實踐。 ViewModel簡介 ViewModel是Android Jetpack架構組件的一部分…

ubuntu安裝Avahi發現服務工具

一、簡介 解決設置固定ip后無法連接外網的問題,目前采用動態獲取ip,可以不用設置設備的固定IP,直接可以通過域名來訪問設備,類似樹莓派的連接調試 二、安裝 本文使用的是ubuntu23.10.1上安裝 1.安裝工具 sudo apt install av…

2.模擬問題——4.日期問題

日期問題難度并不大,但是代碼量非常大,需要較高的熟練度,因此需要著重練習,主要涉及數組和循環兩個方面的知識點,需要熟練的測試代碼。 兩個經典題型 閏年 閏年滿足以下兩個條件的任意一個 能夠被400整除不能夠被1…

MyBatis攔截器實現打印完整SQL語句

我們在執行語句的時候會使用Mybatis自帶的日志打印工具,但是打印的時候參數會用?代替,顯得看起來不是那么直觀,所以通過實現了InnerInterceptor接口,并重寫了beforeQuery和beforeUpdate方法。在這兩個方法中,它會獲取…

【Acwing】差分矩陣

圖1&#xff1a;a和b數組映射表 由于a是b的前綴和數組&#xff0c;因此改變b[ x1][ y1]之后&#xff0c;受到影響的a中元素如右半圖所示 圖2&#xff1a;求b數組的前綴和 #include<bits/stdc.h> using namespace std;int n,m,q; int a[1010][1010]; int b[1010][1010]…

work 3/1

1>機械臂 #include <head.h> #define SER_POTR 8899 #define SER_IP "192.168.125.223" int main(int argc, const char *argv[]) {//創建套接字int cfdsocket(AF_INET,SOCK_STREAM,0);if(cfd-1){perror("");return -1;}//鏈接struct sockaddr_i…

一文搞懂瀏覽器緩存機制

文章目錄 概述強制緩存協商緩存總結參考文章 概述 瀏覽器的緩存機制也就是我們說的HTTP緩存機制&#xff0c;其機制是根據HTTP報文的緩存標識進行的 瀏覽器第一次向服務器發送HTTP請求, 瀏覽器拿到請求結果后&#xff0c;會根據響應報文的緩存標識&#xff0c;決定是否進行緩存…

機器學習:數據處理基操

在處理完數據之后&#xff0c;選擇好模型&#xff0c;就可以用訓練集訓練模型&#xff0c;用測試集輸入模型 然后輸出需要預測的結果啦&#xff5e; 一、模塊導入 import numpy as np import pandas as pd #讀入數據 二、pandas數據 一、dataframe基礎 一、dataframe的創建…

github新手使用詳解及環境搭建案例

對于 GitHub 的新手使用以及環境搭建&#xff0c;以下是詳細的步驟和案例&#xff1a; 一、GitHub 新手使用詳解 注冊 GitHub 賬號&#xff1a;首先&#xff0c;你需要在 GitHub 官網上注冊一個賬號。填寫必要的個人信息&#xff0c;如用戶名、郵箱和密碼等。注冊完成后&…

【代碼】Android|判斷asserts下的文件存在與否,以及普通文件存在與否

作者版本&#xff1a;Android 11及以上 主要是發現網上沒有完整的、能跑的代碼&#xff0c;不知道怎么回事&#xff0c;GPT給我重寫的。我只能保證這個代碼尊嘟能跑&#xff0c;不像其他的缺胳膊少腿的。 asserts 貼一下結果&#xff1a; boolean isAssertFileExists(String …

Nginx配置php起WoWSimpleRegistration服務

WoWSimpleRegistration服務的git地址&#xff1a; GitHub - TrinityCore/WoWSimpleRegistration: Simple Registration page for TrinityCore/AzerothCore/AshamaneCore/CMangos 下載WoWSimpleRegistration 首先git下載&#xff1a; git clone https://github.com/TrinityC…

kafka消費者接收不到消息

背景&#xff1a; 對kafka消息進行監聽&#xff0c;生產者發了消息&#xff0c;但是消費端沒有接到消息&#xff0c;監聽代碼 消費端&#xff0c;kafka配置 spring.kafka.bootstrap-serverskafka.cestc.dmp:9591 spring.kafka.properties.sasl.jaas.configorg.apache.kafka.…

29.HarmonyOS App(JAVA)通知

普通通知: 通知渠道,彈出消息后&#xff0c;自動消失 長文本通知 //多行文本通知 //圖片通知 //社交通知 //媒體通知--經測試&#xff0c;圖片無法顯示&#xff0c;文字不顯示 場景介紹 HarmonyOS提供了通知功能&#xff0c;即在一個應用的UI界面之外顯示的消息&#xff0c;主…

C++之結構體以及通訊錄管理系統

1&#xff0c;結構體基本概念 結構體屬于自定義的數據概念&#xff0c;允許用戶存儲不同的數據類型 2&#xff0c;結構體的定義和使用 語法&#xff1a;struct 結構體名{ 結構體成員列表}&#xff1b; 通過結構體創建變量的方式有三種&#xff1a; 1&#xff0c;struct …