【Linux】從入門到精通:Make與Makefile完全指南

歡迎來到 CILMY23 的博客

🏆本篇主題為:從入門到精通:Make與Makefile完全指南

🏆個人主頁:CILMY23-CSDN博客

🏆系列專欄:C++ | C語言 | Linux | Python | 數據結構和算法 | 算法專題

🏆感謝觀看,支持的可以給個一鍵三連,點贊收藏+評論。如果你覺得有幫助,還可以點點關注


文章目錄

  • 從入門到精通:Make與Makefile完全指南
    • 1. 什么是Make/Makefile?
      • 為什么需要Make?
    • 2. 安裝
      • Centos安裝
    • 3. Makefile基礎語法
        • 基本結構
    • 4. Makefile的特性
      • 4.1 makefile的執行順序
      • 4.2 makefile無法生成可執行文件
        • 如何強制重新編譯?
      • 4.3 makefile進行多文件編譯
      • 4.4 makefile的自動推導
      • 4.5 makefile的變量
      • 4.6 makefile省去中間過程


從入門到精通:Make與Makefile完全指南

1. 什么是Make/Makefile?

Make是一個自動化構建工具,主要用于管理源代碼的編譯和構建過程。它通過讀取Makefile文件來執行構建任務,能夠自動檢測文件變化并僅編譯必要內容,顯著提升開發效率。

為什么需要Make?

  • 自動化重復的編譯命令

  • 處理復雜的依賴關系

  • 實現增量編譯(僅編譯修改過的文件)

  • 標準化團隊的構建流程

2. 安裝

Centos安裝

# CentOS/RHEL
sudo yum install make

3. Makefile基礎語法

因為make是一個命令,而makefile是一個文件,所以我們需要在我們的當前目錄下創建一個makefile文件。

基本結構

Makefile 規則的基本格式為:

makefile
目標(target): 依賴(dependencies)command

makefile主要分為三個部分

  • 目標文件 (target):要生成的文件或操作名稱(如 hello.exe 或 clean)。
  • 依賴文件 (dependencies):生成目標所需的文件或條件(如 hello.c)。
  • 依賴方法,命令 (command):生成目標的具體命令(以 Tab 開頭,不能用空格)。

參考如下,這里的phony先忽略,我們先看前面的就行了。

在這里插入圖片描述

根據上圖我們可以解釋一下這三個部分,首先hello.exe是我們的目標文件,冒號后跟著的是一個依賴文件列表,按照空格為分割符,可以有多個文件,也可以為空。
再接下來是依賴方法,一定要用tab符號開頭,然后寫指令。

在這里插入圖片描述

然后我們可以用make命令運行這一部分

在這里插入圖片描述
我們可以看到生成了目標文件hello.exe,執行的命令,也就是依賴方法,是我們的第二行。

那我們生成的時候總會有很多的臨時文件,怎么辦呢?

這時候makefile就提供了一個清理功能。

在這里插入圖片描述

我們可以在makefile文件中編輯clean,實現這一功能。

我們在終端中輸入 make clean 就可以很好的清理了。

在這里插入圖片描述

4. Makefile的特性

4.1 makefile的執行順序

我們利用make執行makefile的時候,默認是從上往下執行的,也就是會生成第一個目標文件。

在這里插入圖片描述
make會根據我們的makefile自動執行編譯/清理工作。

4.2 makefile無法生成可執行文件

實際上makefile有一個特性,是對于最新的可執行文件默認不生成,這實際上是為了提高效率,你可以看到你的報錯如圖所示:

在這里插入圖片描述

make說hello.exe 是最新的日期。

那makefile是怎么知道我們需要重新生成了呢?

這就不得不提我們之前涉及的一個時間了:
在這里插入圖片描述

Make 的工作原理是基于時間戳的依賴檢查,Make 會對比目標文件(如 hello.exe)和依賴文件(如 hello.c)的修改時間:如果目標文件比依賴文件舊(或目標文件不存在),則執行命令重新生成。如果目標文件比依賴文件新,則跳過命令,提示 is up to date。

所以當我們第一次執行 make

gcc -o hello.exe hello.c

Make 檢測到 hello.exe 不存在 或 hello.c 被修改過,觸發編譯命令,生成 hello.exe。

第二次執行 make

make: 'hello.exe' is up to date.

Make 發現 hello.exe 已存在,且它的修改時間晚于 hello.c 的修改時間,因此認為無需重新編譯。

如何強制重新編譯?

如果希望無視時間戳強制重新編譯,可以使用.PHONY:
在這里插入圖片描述
方法:

.PHONY:xxx

xxx對應的依賴方法總是要執行的,xxx對應的是目標文件,或者clean。

4.3 makefile進行多文件編譯

如果總是要寫每個文件那就很麻煩了,因為一個工程里可能有很多文件,所以makefile提供了一種方法直接進行多文件的編譯。

 hello.exe:hello.cgcc -o $@  $^

這里的@就對應我們的目標文件,^就對應我們的依賴文件列表,這樣的話我們就可以進行多文件的編譯。

在這里插入圖片描述

makefile就會自動替代,$可以理解為自動取內容。

4.4 makefile的自動推導

我們用makefile重新進行這個程序的完全翻譯過程就好做多了

在這里插入圖片描述

在這里插入圖片描述

我們發現makefile給我們都按照順序推導完了,生成了對應的目標文件,并且最終文件也可以運行.

從這個過程中我們發現,makefile/make會自動根據文件中的依賴關系,進行自動推導,幫助我們執行所有相關的依賴方法。

因為我們沒有hello.o的依賴文件的時候,是無法生成hello.exe可執行文件的,所以第二行的命令就無法執行,

  1 hello.exe:hello.o2   gcc -o hello.exe hello.o

makefile就會去找對應的依賴

3 hello.o:hello.s
4   gcc -c hello.s -o hello.o

makefile也同樣找不到,直到最后一段找到了,然后此刻就會生成對應的依賴,所以這里有一個依賴鏈:修改hello.c會觸發后續所有目標的重建(hello.i → hello.s → hello.o → hello.exe)。這個過程就像入棧一樣,第一個入棧,然后第二個入棧……,執行的時候就像遞歸一樣,往回推導,這也就是我們的makefile會自動推導的情況。

如果makefile中的內容是亂序的,那makefile也會自動推導,也就是順序不影響makefile執行。但是我們得把最重要的文件放前面,就比如下面這種情況:

在這里插入圖片描述

在這里插入圖片描述

4.5 makefile的變量

makefile不像C語言那樣設計變量,它跟python一樣,左邊是變量名字,右邊的變量的內容。

目標文件的變量:

1 bin=hello.exe   
//bin = hello.exe

注意,中間不能用空格, 也就是我們這里的第二種寫法是不允許的。

同樣的,依賴文件我們也可以采用這種形式

2 src=test.c

這里的依賴文件中間可以用空格隔開。

那如何使用變量呢?我們得加上$()

在這里插入圖片描述

4.6 makefile省去中間過程

如果我們不想看到中間過程,只需要在對應的命令前面加上@就可以了。

在這里插入圖片描述
這樣中間過程就很簡略了
在這里插入圖片描述

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

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

相關文章

利用PyQt簡單的實現一個機器人的關節JOG界面

在上一篇文章中如何在Python用Plot畫出一個簡單的機器人模型,我們介紹了如何在Python中畫出一個簡單的機器人3D模型,但是有的時候我們需要通過界面去控制機器人每一個軸的轉動,并實時的顯示出當前機器人的關節位置和末端笛卡爾位姿。 那么要實…

iOS 使用消息轉發機制實現多代理功能

在iOS開發中,我們有時候會用到多代理功能,比如我們列表的埋點事件,需要我們在列表的某個特定的時機進行埋點上報,我們當然可以用最常見的做法,就是設置代理實現代理方法,然后在對應的代理方法里面進行上報&…

XGBoost和LightGBM機器學習算法對比及實戰

文章目錄 1. XGBoost 原理核心思想關鍵技術點2. LightGBM 原理核心思想關鍵技術點3. XGBoost vs LightGBM 對比4. 適用場景選擇5. 總結1. 數據準備2. XGBoost 示例安裝庫代碼實現3. LightGBM 示例安裝庫代碼實現4. 關鍵參數對比5. 注意事項6. 輸出示例XGBoost 和 LightGBM 是兩…

局域網自動識別機器名和MAC并生成文件的命令

更新版本:添加了MAC 地址 確定了設備唯一性 V1.1 局域網自動識別機器名和MAC并生成文件的批處理命令 echo off setlocal enabledelayedexpansionREM 設置輸出文件 set outputFilenetwork_info.txtREM 清空或創建輸出文件 echo Scanning network from 192.168.20.1…

基于Python+Vue開發的體育用品商城管理系統源碼+開發文檔+課程作業

項目簡介 該項目是基于PythonVue開發的體育用品商城管理系統(前后端分離),這是一項為大學生課程設計作業而開發的項目。該系統旨在幫助大學生學習并掌握Python編程技能,同時鍛煉他們的項目設計與開發能力。通過學習基于Python的體…

pyQT5簡易教程(一):制作一個可以選擇本地圖片并顯示的桌面應用

可以參考之前的教程安裝 PyQt 和 PyQt Designer https://blog.csdn.net/smx6666668/article/details/145909326?spm=1011.2415.3001.10575&sharefrom=mp_manage_link 一、打開pycharm中的QTdesigner 二、設計界面 和之前一樣,使用 PyQt Designer 來設計界面并保存為 .u…

LeetCode 解題思路 6(Hot 100)

解題思路: 初始化窗口元素: 遍歷前 k 個元素,構建初始單調隊列。若當前索引對應值大于等于隊尾索引對應值,移除隊尾索引,將當前索引加入隊尾。遍歷結束時當前隊頭索引即為當前窗口最大值,將其存入結果數組…

基于redis的位圖實現簽到功能

基于Redis位圖實現簽到功能是一種高效且節省內存的方法。以下是分步實現的詳細方案&#xff1a; 1. 鍵設計策略 采用 sign:<userId>:<YYYYMM> 格式存儲每月簽到數據 # 示例&#xff1a;用戶1001在2023年8月的簽到數據 sign_key "sign:1001:202308"2.…

C++ Qt OpenGL渲染FFmpeg解碼后的視頻

本篇博客介紹使用OpenGL渲染FFmpeg解碼后的視頻,涉及到QOpenGLWidget、QOpenGLFunctions、OpenGL shader以及紋理相關,播放效果如下: 開發環境:Win11 C++ Qt6.8.1、FFmpeg4.0、x64 ??注意:Qt版本不同時,Qt OpenGL API及用法可能差別比較大,FFmpeg版本不同時API調用可能…

deepseek部署:ELK + Filebeat + Zookeeper + Kafka

## 1. 概述 本文檔旨在指導如何在7臺機器上部署ELK&#xff08;Elasticsearch, Logstash, Kibana&#xff09;堆棧、Filebeat、Zookeeper和Kafka。該部署方案適用于日志收集、處理和可視化場景。 ## 2. 環境準備 ### 2.1 機器分配 | 機器編號 | 主機名 | IP地址 | 部署組件 |-…

2.數據結構:1.Tire 字符串統計

1.Tire 字符串統計 #include<algorithm> #include<cstring> #include<iostream>using namespace std;const int N100010; int son[N][26];//至多 N 層&#xff0c;每一層至多 26 個節點&#xff08;字母&#xff09; int cnt[N];//字符串至多 N 個&#xff…

算法(四)——位運算與位圖

文章目錄 位運算、位圖位運算基本位運算異或運算交換兩個數無比較返回最大值缺失的數字唯一出現奇數次的數唯二出現奇數次的數唯一出現次數少于m次的數 位運算進階判斷一個整數是不是2的冪判斷一個整數是不是3的冪大于等于n的最小的2的冪[left, right]內所有數字&的結果反轉…

本地部署deepseek大模型后使用c# winform調用(可離線)

介于最近deepseek的大火&#xff0c;我就在想能不能用winform也玩一玩本地部署&#xff0c;于是經過查閱資料&#xff0c;然后了解到ollama部署deepseek,最后用ollama sharp NUGet包來實現winform調用ollama 部署的deepseek。 本項目使用Vs2022和.net 8.0開發&#xff0c;ollam…

SpringBoot原理-02.自動配置-概述

一.自動配置 所謂自動配置&#xff0c;就是Spring容器啟動后&#xff0c;一些配置類、bean對象就自動存入了IOC容器當中&#xff0c;而不需要我們手動聲明&#xff0c;直接從IOC容器中引入即可。省去了繁瑣的配置操作。 我們可以首先將spring項目啟動起來&#xff0c;里面有一…

P10265 [GESP樣題 七級] 迷宮統計

題目描述 在神秘的幻想?陸中&#xff0c;存在著 n 個古老而神奇的迷宮&#xff0c;迷宮編號從 1 到 n。有的迷宮之間可以直接往返&#xff0c;有的可以?到別的迷宮&#xff0c;但是不能?回來。玩家小楊想挑戰?下不同的迷宮&#xff0c;他決定從 m 號迷宮出發。現在&#x…

Spring框架中的工廠模式

在Spring框架里&#xff0c;工廠模式的運用十分廣泛&#xff0c;它主要幫助我們創建和管理對象&#xff0c;讓對象的創建和使用分離&#xff0c;提高代碼的可維護性和可擴展性。下面為你詳細介紹Spring框架中工廠模式的具體體現和示例&#xff1a; 1. BeanFactory 作為工廠模式…

音視頻-WAV格式

1. WAV格式說明&#xff1a; 2. 格式說明&#xff1a; chunkId&#xff1a;通常是 “RIFF” 四個字節&#xff0c;用于標識文件類型。&#xff08;wav文件格式表示&#xff09;chunkSize&#xff1a;表示整個文件除了chunkId和chunkSize這 8 個字節外的其余部分的大小。Forma…

SQL Server Management Studio的使用

之前在https://blog.csdn.net//article/details/140961550介紹了在Windows10上安裝SQL Server 2022 Express和SSMS&#xff0c;這里整理下SSMS的簡單使用&#xff1a; SQL Server Management Studio(SSMS)是一種集成環境&#xff0c;提供用于配置、監視和管理SQL Server和數據…

數據集筆記:NUSMods API

1 介紹 NUSMods API 包含用于渲染 NUSMods 的數據。這些數據包括新加坡國立大學&#xff08;NUS&#xff09;提供的課程以及課程表的信息&#xff0c;還包括上課地點的詳細信息。 可以使用并實驗這些數據&#xff0c;它們是從教務處提供的官方 API 中提取的。 該 API 由靜態的…

劍指 Offer II 031. 最近最少使用緩存

comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20031.%20%E6%9C%80%E8%BF%91%E6%9C%80%E5%B0%91%E4%BD%BF%E7%94%A8%E7%BC%93%E5%AD%98/README.md 劍指 Offer II 031. 最近最少使用緩存 題目描述 運用所掌握的…