【C/C++】Makefile文件的介紹與基本用法

創作不易,本篇文章如果幫助到了你,還請點贊 關注支持一下?>𖥦<)!!
主頁專欄有更多知識,如有疑問歡迎大家指正討論,共同進步!
🔥c++系列專欄:C/C++零基礎到精通 🔥

給大家跳段街舞感謝支持!? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

在這里插入圖片描述

c語言內容💖:

專欄:c語言之路重點知識整合

【c語言】全部知識點總結


目錄

  • Makefile 介紹:
    • 源代碼的編譯過程
  • Makefile 的基本語法:
  • 示例

Makefile 介紹:

Makefile 是被用于自動化構建過程的腳本文件,對一個項目具有高可用性可重用性

Makefile 描述了如何從一個或多個源文件編譯、鏈接和生成目標文件或可執行文件

可以通過使用 make 命令方便地編譯和重新編譯項目,而無需手動執行每個構建步驟。

源代碼的編譯過程

在我們編寫完代碼之后的.c文件被稱為源代碼文件,此時是代碼的預處理期。

  • 編譯期:在我們按下調試鍵后,編譯軟件中的編譯器會將我們的源代碼進行編譯,成為匯編語言,如果我們在書寫代碼中有語法等錯誤,在編譯時編譯器將不會通過,會報出以C為開頭的錯誤(編譯:compile)即為編譯錯誤。
  • 匯編期:在經過匯編期后,匯編語言會由匯編器轉化為真正的機器語言即01指令,生成.obj文件(目標文件),通過對代碼調試反匯編可以看到,我們的一句代碼在機器語言中對應了很多行的機器語言。
  • 連接期:通過連接器計算機將一些.obj文件整合到一起,通過頭文件(庫函數)連接到一起,打包組成了最終的exe可執行文件。如果出現了LNK錯誤即是連接期出現了問題,可能是main函數出現錯誤(一個項目沒有或者有多個main函數)或者缺少頭文件。執行期即執行該exe文件。

Makefile 的基本語法:

Makefile 一般包含:

  • 顯式規則:顯式規則說明如何生成一個或多個的目標文件。明顯指出要生成的文件,文件的依賴文件,生成的命令。 TARGET 變量定義了最終生成的可執行文件的名稱。

  • 變量定義:在 Makefile 中可以定義一系列的變量,變量一般都是字符串,當 Makefile 被執行時,變量的值會被擴展到相應的引用位置上。

  • 文件指示:其包括了三個部分,一個是在一個 Makefile 中引用另一個 Makefile,就像 C 語言中的 include 一樣;另一個是指根據某些情況指定 Makefile 中的有效部分,就像 C 語言中的預編譯#if 一樣;還有就是定義一個多行的命令。

  • 注釋:Makefile 中只有行注釋,和 UNIX 的 Shell 腳本一樣,使用“#”字符

  • CC 變量定義了要使用的編譯器(在這里是 gcc)。

  • SRCS 變量包含所有的源文件,OBJS 變量則是從 SRCS 變量中的 .c 擴展名替換為 .o 得到的,代表目標文件。

  • all 是默認目標,當運行 make 命令時,它會首先嘗試構建這個目標。all 依賴于 $(TARGET),即它會嘗試構建可執行文件。

  • $(TARGET): $(OBJS) 描述了如何從目標文件生成可執行文件。使用了 $(CC) 變量定義的編譯器,并將所有的目標文件鏈接起來生成可執行文件。

  • %.o: %.c 描述了如何從 C 源文件編譯生成目標文件。 < 代表依賴項(源文件), < 代表依賴項(源文件), <代表依賴項(源文件),@ 代表目標(目標文件)。

  • clean 目標是一個常用的清理規則,用于刪除生成的目標文件和可執行文件。使用 make clean 命令執行


示例

main.c 生成可執行文件 app 的 makefile 文件示例:

# 定義gcc編譯器  
CC=gcc  # 定義源文件和目標文件  
SRCS=main.c 
OBJS=$(SRCS:.c=.o)  
TARGET=app# 默認目標:all  
all: $(TARGET)  
# 鏈接目標文件以生成可執行文件  
$(TARGET): $(OBJS)  $(CC) $(OBJS) -o $(TARGET)  
# 從源文件編譯生成目標文件  
%.o: %.c  $(CC) -c $< -o $@  
# 清除生成的目標文件和可執行文件  
clean:  rm -f $(OBJS) $(TARGET)
CC=gcc  
CFLAGS=-Wall -g  # 添加編譯選項  # 使用通配符獲取所有.c文件  
CFILES=$(wildcard *.c)  
OBJS=$(CFILES:.c=.o)  # 默認目標:all  
all: app  # 鏈接目標文件以生成可執行文件  
app: $(OBJS)  $(CC) $(CFLAGS) -o app $(OBJS)  # 從源文件編譯生成目標文件  
%.o: %.c  $(CC) $(CFLAGS) -c $< -o $@  # 清除生成的目標文件和可執行文件  
clean:  rm -rf hello *.o

image.png


在這里插入圖片描述

大家的點贊、收藏、關注將是我更新的最大動力! 歡迎留言或私信建議或問題。
大家的支持和反饋對我來說意義重大,我會繼續不斷努力提供有價值的內容!如果本文哪里有錯誤的地方還請大家多多指出(●'?'●)

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

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

相關文章

第三周:從錯誤中認識到管理

1. 約定兩周時間&#xff0c;完成這個功能 在管理者分配好項目任務后&#xff0c;只是口頭約定兩周的時間&#xff0c;沒有形成需求文檔。對于需求&#xff0c;人與人的理解是不一樣的&#xff0c;有些太過于抽象的東西&#xff0c;太難以描繪&#xff0c;只能一而再再而三的確…

【論文復現】LSTM長短記憶網絡

LSTM 前言網絡架構總線遺忘門記憶門記憶細胞輸出門 模型定義單個LSTM神經元的定義LSTM層內結構的定義 模型訓練模型評估代碼細節LSTM層單元的首尾的處理配置Tensorflow的GPU版本 前言 LSTM作為經典模型&#xff0c;可以用來做語言模型&#xff0c;實現類似于語言模型的功能&am…

vue3的proxy如何取代object和defineproperty

在 Vue 2.x 中&#xff0c;為了響應式地追蹤對象屬性的變化&#xff0c;Vue 使用了 Object.defineProperty 方法。但是&#xff0c;Object.defineProperty 有一些限制&#xff0c;比如它不能追蹤屬性的添加或刪除&#xff0c;也不能直接用于數組或對象原型鏈上的屬性。 Vue 3.…

【Torch學習筆記】

作者&#xff1a;zjk 和 的區別是逐元素相乘&#xff0c;是矩陣相乘 cat stack 的區別 cat stack 是用于沿新維度將多個張量堆疊在一起的函數。它要求所有輸入張量具有相同的形狀&#xff0c;并在指定的新維度上進行堆疊。

【NumPy】關于numpy.mean()函數,看這一篇文章就夠了

&#x1f9d1; 博主簡介&#xff1a;阿里巴巴嵌入式技術專家&#xff0c;深耕嵌入式人工智能領域&#xff0c;具備多年的嵌入式硬件產品研發管理經驗。 &#x1f4d2; 博客介紹&#xff1a;分享嵌入式開發領域的相關知識、經驗、思考和感悟&#xff0c;歡迎關注。提供嵌入式方向…

Android11熱點啟動和關閉

Android官方關于Wi-Fi Hotspot (Soft AP) 的文章&#xff1a;https://source.android.com/docs/core/connect/wifi-softap?hlzh-cn 在 Android 11 的WifiManager類中有一套系統 API 可以控制熱點的開和關&#xff0c;代碼如下&#xff1a; 開啟熱點&#xff1a; // SoftApC…

Vue 父組件使用refs來直接訪問和修改子組件的屬性或調用子組件的方法

步驟 1: 在子組件中定義要被修改的屬性或方法 首先&#xff0c;在子組件中定義你想要父組件能夠修改或調用的屬性或方法。例如&#xff0c;我們有一個名為MyChildComponent的子組件&#xff0c;它有一個名為childData的數據屬性和一個名為updateData的方法。 // 子組件 MyChi…

國際版Tiktok抖音運營流量實戰班:賬號定位/作品發布/熱門推送/等等-13節

課程目錄 1-tiktok賬號定位 1.mp4 2-tiktok作品發布技巧 1.mp4 3-tiktok數據功能如何開通 1.mp4 4-tiktok熱門視頻推送機制 1.mp4 5-如何發現熱門視頻 1.mp4 6-如何發現熱門音樂 1.mp4 7-如何尋找熱門標簽 1.mp4 8-如何尋找垂直熱門視頻 1.mp4 9-如何發現熱門挑戰賽 1…

【Python特征工程系列】一文教你使用PCA進行特征分析與降維(案例+源碼)

這是我的第287篇原創文章。 一、引言 主成分分析&#xff08;Principal Component Analysis, PCA&#xff09;是一種常用的降維技術&#xff0c;它通過線性變換將原始特征轉換為一組線性不相關的新特征&#xff0c;稱為主成分&#xff0c;以便更好地表達數據的方差。 在特征重要…

DAMA數據管理知識體系必背18張框圖

近期對數據管理知識體系中比較重要的框圖進行了梳理總結,總共有18張框圖,供大家參考。主要涉及數據管理、數據治理階段模式、數據安全需求、主數據管理關鍵步驟,主數據架構、DW架構、數據科學的7個階段、數據倉庫建設活動、信息收斂三角、大數據分析架構圖、數據管理成熟度等…

QGIS開發筆記(二):Windows安裝版二次開發環境搭建(上):安裝OSGeo4W運行依賴其Qt的基礎環境Demo

若該文為原創文章&#xff0c;轉載請注明原文出處 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/139136356 長沙紅胖子Qt&#xff08;長沙創微智科&#xff09;博文大全&#xff1a;開發技術集合&#xff08;包含Qt實用技術、樹莓派、三維、OpenCV…

如果返回的json 中有 ‘///’ 轉換

// 將返回數據的三條/和替換空 rowData.Jsonobj rowData.Jsonobj .replace(/^\s*\/\/\/.*$/gm, //); // 將返回的替換成" 并且外面加個"" rowData.Jsonobj "${rowData.Jsonobj .replace(//g, ")}"; // 轉換回來數據用兩個 JSON.parse(JSON.par…

Charles抓包App_https_夜神模擬器

Openssl安裝 下載安裝 下載地址&#xff1a; http://slproweb.com/products/Win32OpenSSL.html 我已經下載好了64位的&#xff0c;也放出來&#xff1a; 鏈接&#xff1a;https://pan.baidu.com/s/1Nkur475YK48_Ayq_vEm99w?pwdf4d7 提取碼&#xff1a;f4d7 --來自百度網…

地下城游戲(leetcode)

個人主頁&#xff1a;Lei寶啊 愿所有美好如期而遇 地下城游戲https://leetcode.cn/problems/dungeon-game/description/ 圖解分析&#xff1a; 代碼 class Solution { public:int calculateMinimumHP(vector<vector<int>>& vv) {int row vv.size(), col …

Zookeeper 安裝教程和使用指南

一、Zookeeper介紹 ZooKeeper 是 Apache 軟件基金會的一個開源項目&#xff0c;主要基于 Java 語言實現。 Apache ZooKeeper 是一個開源的分布式應用程序協調服務&#xff0c;提供可靠的數據管理通知、數據同步、命名服務、分布式配置服務、分布式協調等服務。 關鍵特性 分布…

Nginx實戰(安裝部署、常用命令、反向代理、負載均衡、動靜分離)

文章目錄 1. nginx安裝部署1.1 windows安裝包1.2 linux-源碼編譯1.3 linux-docker安裝 2. nginx介紹2.1 簡介2.2 常用命令2.3 nginx運行原理2.3.1 mater和worker2.3.3 Nginx 的工作原理 2.4 nginx的基本配置文件2.4.1 location指令說明 3. nginx案例3.1 nginx-反向代理案例013.…

數據結構和算法|排序算法系列(三)|插入排序(三路排序函數std::sort)

首先需要你對排序算法的評價維度和一個理想排序算法應該是什么樣的有一個基本的認知&#xff1a; 《Hello算法之排序算法》 主要內容來自&#xff1a;Hello算法11.4 插入排序 插入排序的整個過程與手動整理一副牌非常相似。 我們在未排序區間選擇一個基準元素&#xff0c;將…

移動云以深度融合之服務,令“大”智慧貫穿云端

移動云助力大模型&#xff0c;開拓創新領未來。 云計算——AI模型的推動器。 當前人工智能技術發展的現狀和趨勢&#xff0c;以及中國在人工智能領域的發展策略和成就。確實&#xff0c;以 ChatGPT 為代表的大型語言模型在自然語言處理、文本生成、對話系統等領域取得了顯著的…

項目管理:敏捷實踐框架

一、初識敏捷 什么是敏捷(Agile)?敏捷是思維方式。 傳統開發模型 央企,國企50%-60%需求分析。整體是由文檔控制的過程管理。 傳統軟件開發面臨的問題: 交付周期長:3-6個月甚至更長溝通效果差:文檔化溝通不及時按時發布低:技術債增多無法發版團隊士氣弱:死亡行軍不關注…

Vmware 17安裝 CentOS9

前言 1、提前下載好需要的CentOS9鏡像&#xff0c;下載地址&#xff0c;這里下載的是x86_64 2、提前安裝好vmware 17&#xff0c;下載地址 &#xff0c;需要登錄才能下載 安裝 1、創建新的虛擬機 2、在彈出的界面中選擇對應的類型&#xff0c;我這里選擇自定義&#xff0c;點…