Linux 自動化構建工具 make/Makefile

来源:https://www.cnblogs.com/helong-123/archive/2022/06/20/16393401.html
-Advertisement-
Play Games

鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 VS中有一鍵編譯+自動運行,Linux也給我們提供了對應的編譯方式,雖然不及VS那麼便捷,但是相比於手動輸入 gcc -o add add.c ,我們一句make就可以搞定 Makefile是一個文件,能夠存放上述 gcc -o add add. ...


鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站

VS中有一鍵編譯+自動運行,Linux也給我們提供了對應的編譯方式,雖然不及VS那麼便捷,但是相比於手動輸入 gcc -o add add.c ,我們一句make就可以搞定

Makefile是一個文件,能夠存放上述 gcc -o add add.c 這種編譯指令

make是一個命令工具,能夠解釋Makefile中的指令

要如何編譯.c文件,關鍵就在於Makefile是怎麼寫的,下麵我們主要介紹這兩者的使用

一、 單個文件的編譯

假設我們要編譯這麼一個test.c文件,我們希望編譯生成一個名為test的可執行文件

file

我們在test.c所在目錄下創建一個Makefile文件,這裡有兩種編譯寫法

1、寫法一:逐個生成.i、.s、.o文件,最後再生成 test執行文件

先一步步向下分析,需要什麼依賴文件,然後再一步步生成

file

編寫好以後,我們只需要在命令行輸入make,系統就會幫我們自動編譯了,同時會生成每一步產生的文件按

file

2、 寫法二:一步到位,直接通過 test.c 生成 test 執行文件(推薦)

Makefile中要寫的內容如下

file

第一行:確定好依賴文件和目標文件。也就是要用依賴文件來生成目標文件

第二行:編譯指令。

            $@ 指向第一行的目標文件,表示目標文件test

            $^ 指向第一行的依賴文件,表示依賴文件test.c

            -std 表示採用的C++標準

接下來我們只需要在命令行輸入make,系統就會幫我們編譯了,編譯成功以後,當前目錄下就會多出一個test 執行文件

file

file

3、 Makefile自動清理

我們每次開始編譯之前,我們最好先清理一下之前生成的執行文件,手動輸入 rm test 有點太麻煩了,Makefile只要寫入下麵的內容,就會自動幫我們清理了

file

如果我們還希望移除生成的.o 、.s、.i文件,那麼第6行只要換成

rm -f test test.o test.s test.i

一般我們make的時候,系統會自動調用,當然也可以手動調用,如

file

file

我們會發現之前的test執行文件不見了

二、多個文件的編譯(同一目錄下)

現在我們有三個文件,分別是test.c、sub.c、sub.h,而且我們要在test.c中調用sub.h中的函數

file

Makefile中的內容如下:

file

test執行文件 要依賴 多個文件生成的 .o文件,現在沒有 .o文件,所以需要重新生成 .o文件

當前路徑下有多個.c文件,我們逐個去寫的話,就是

test.o:test.c
    gcc -c $@ $^
sub.o:sub.c
    gcc -c $@ $^

但是這樣寫太複雜了,我們可以選擇下麵這種寫法

%.o: %.c
    gcc -c $<
  • %.o:表示目標文件是 .o文件

  • %.c:表示依賴文件是當前路徑下的 .c文件,可以看作是一個集合中放著 test.c sub.c

  • $< : 展開%.c ,逐個生成對應的 .o文件,比如test.c就會生成對應的test.o、sub.c就會生成對應的

      sub.o
    

現在我們來運行一下

file

file

三、多個文件的編譯(不同目錄下)

現在我們有三個文件,test.c、sub.h、sub.c,但是其中sub.h、sub.c在其目錄func_dir 下

file

file

Makefile的內容如下:

file

現在我們來運行一下試試

file

file

四、一次生成多個運行文件

1、常規寫法嘗試及其不可行的原因

=常規寫法嘗試=

上面的都是一個main函數文件 + 一堆函數文件的編譯,但是有的時候,比如不同進程間通信時,我們可能需要一次生成兩個運行文件,如果我們按照常規的思路來寫,會怎麼樣?

file

file

測試結果如下,我們發現只生成了一個運行文件,很顯然無法按照常規的寫法來寫

file

=原因分析=

Makefile自動構建結束會生成運行文件,預設只生成最開始的一個,我們寫的時候,server的生成放在client的前面,server就是最開始的哪一個,所以Makefile就只生成了 server

2、改進

Makefile既然生成server以後,就不會繼續生成下一個運行文件,那麼我們就要在這之前就告訴Makefile,我希望生成兩個運行文件(因為Makefile是自頂向下運行的,不會上來就去執行gcc指令)

file

然後我們再來看一下測試結果,現在就能一次生成兩個運行文件了

file

本文轉自:https://blog.csdn.net/challenglistic/article/details/124249349


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 大佬的理解->《Java IO(五) -- 字元流進階及BufferedWriter,BufferedReader》 1、BufferedReader BufferedReader高效字元流讀取文件基本用法,自帶緩衝區,讀取文件效率高,支持逐行讀取; 1.1 初始化 BufferedReader(R ...
  • 游戲的世界精彩紛呈,有動作類、策略類、角色扮演類等諸多類型,還有很多難以分類的小游戲,讓人玩起來往往愛不釋手 ...
  • 大佬的理解->《Java IO(四) -- 字元流》 FileReader字元流讀取文件,更適合用於讀取文件,可以讀取中文 1、FileReader 1.1 初始化 FileReader(File file) FileReader(String fileName) 1.2 讀取文件內容 read() ...
  • 項目全部代碼地址:https://github.com/Tom-shushu/work-study.git (mqtt-emqt 項目) 先看我們最後實現的一個效果 1.手機端向主題 topic111 發送消息,並接收。(手機測試工具名稱:MQTT調試器) 2.控制台列印 MQTT基本簡介 MQTT ...
  • 大佬的理解->《Java IO(三) -- 位元組流》 1、FileInputStream 1.1 初始化 FileInputStream(String name) FileInputStream(File file) //直接通過文件地址初始化 FileInputStream fis = new i ...
  • 第二回 巧習得元素分類 子不知懷璧其罪 雲溪父親見狀看了看雲溪,臉上滲出意思冷汗,但遲疑一下就立即退了出去,匆匆忙忙的往右邊廚房趕,只留下了雲溪和這位神秘的老爺子。 雲溪瞠目結舌的看著悠然自得的喝著老爹泡的茶的老爺子,下意識說了一句:“老先生你怎麼這麼快,還知道我要來這裡”。 “方向,你一直在繞巷子 ...
  • 一、Iproute2簡介 Iproute2是一個在Linux下的高級網路管理工具軟體。實際上,它是通過rtnetlink sockets方式動態配置內核的一些小工具組成的,從Linux2.2內核開始,Alexey Kuznetsov 實現了通過rtnetlink sockets用來配置網路協議棧,它 ...
  • 目錄 一、前景回顧 二、用C語言編寫內核 三、載入內核 四、運行測試 一、前景回顧 本回開始,我們要開始編寫內核代碼了,在此之前,先梳理一下已經完成的工作。 藍色部分是目前已經完成的部分,黃色部分是本節將要實現的。 二、用C語言編寫內核 為什麼要用C語言來編寫內核呢,其實用彙編語言也可以實現,只是對 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...