」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 理解Makefile(以C語言為例)。

理解Makefile(以C語言為例)。

發佈於2024-07-31
瀏覽:139

Comprendre le Makefile (Exemple avec langage C).

Makefile 是 make 工具用來自動編譯程式的檔案。以下是編寫有效 Makefile 的標準規則和最佳實踐:

Makefile 的基本結構

  1. 目標:您想要建立的內容(例如可執行檔)。
  2. 先決條件:建構目標所需的文件(例如原始檔)。
  3. 規則:建立目標時執行的命令。

簡單的例子

target: prerequisites
    command

標準規則

  1. 預設規則:Makefile 中的第一個目標是預設建置的目標。

  2. 編譯原始檔:

    • 使用編譯器和選項的變數。
    • 例子 :
   CC = gcc
   CFLAGS = -Wall -g
   SOURCES = main.c utils.c
   OBJECTS = $(SOURCES:.c=.o)
   TARGET = mon_programme

   $(TARGET): $(OBJECTS)
       $(CC) -o $@ $^

   %.o: %.c
       $(CC) $(CFLAGS) -c $



  1. Phonies:對非文件目標使用 .PHONY。
   .PHONY: clean
   clean:
       rm -f $(OBJECTS) $(TARGET)
  1. 變數:使用變數來簡化路徑和選項的管理。
   CC = gcc
   CFLAGS = -Wall
  1. 依賴管理:使用隱式規則和模式來減少重複。

  2. 自動依賴關係:可以為.o檔案自動產生依賴關係。

   -include $(OBJECTS:.o=.d)

完整範例

這是一個完整的Makefile範例:

# Variables
CC = gcc
CFLAGS = -Wall -g
SOURCES = main.c utils.c
OBJECTS = $(SOURCES:.c=.o)
TARGET = mon_programme

# Règle par défaut
all: $(TARGET)

# Lien de l'exécutable
# $@ -> $(TARGET)
# $^ -> $(OBJECTS)
$(TARGET): $(OBJECTS)
    $(CC) -o $@ $^

# Compilation des fichiers .c en .o
# $ Premier element des pr
%.o: %.c
    $(CC) $(CFLAGS) -c $



良好做法

  1. 用製表符縮排:規則中的命令必須用製表符縮進,而不是空格。

  2. 註解程式碼:使用註解來解釋 Makefile 的各個部分。

  3. 分組文件:如果您的專案包含多個文件,請將它們組織到子目錄中並使用變數來管理路徑。

  4. 使用隱式規則:利用make的內建規則,避免重寫公共規則。

為什麼要使用.PHONY?

  • 避免衝突:如果存在與目標同名的文件,make會認為目標是最新的,不會執行關聯的命令。 .PHONY 避免了這種情況。

  • 效能改進: 虛假目標始終被視為“待辦事項”,這可能會提高關聯命令的執行速度。

為什麼要使用%.o:%c進行編譯?

  • 效率:使用 %.o:%c 可以讓您受益於 make 最佳化,只重新編譯必要的內容。

  • 實用:對於較大的項目,%.o:%c 較為合適。

結論

結構良好的 Makefile 讓專案管理更加容易並避免編譯錯誤。透過遵循這些規則和最佳實踐,您可以建立高效且可維護的 Makefile。

版本聲明 本文轉載於:https://dev.to/ashcript/comprendre-le-makefile-exemple-avec-le-langage-c-47n9如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • Python元類工作原理及類創建與定制
    Python元類工作原理及類創建與定制
    python中的metaclasses是什麼? Metaclasses負責在Python中創建類對象。就像類創建實例一樣,元類也創建類。他們提供了對類創建過程的控制層,允許自定義類行為和屬性。 在Python中理解類作為對象的概念,類是描述用於創建新實例或對象的藍圖的對象。這意味著類本身是使用...
    程式設計 發佈於2025-04-18
  • 掌握複合組件:打造靈活可複用的React組件
    掌握複合組件:打造靈活可複用的React組件
    介紹 在React世界上最有用,最廣泛使用的概念之一是設計模式,因為它們有助於保持代碼可擴展並為我們創建的組件提供添加的含義。 有多種模式,在本文中,我們將討論,這是一種高級模式,對於創建靈活且可合併的接口特別有用。 什麼是複合組件? 複合組件是React中的高級模...
    程式設計 發佈於2025-04-18
  • 大批
    大批
    [2 數組是對象,因此它們在JS中也具有方法。 切片(開始):在新數組中提取部分數組,而無需突變原始數組。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    程式設計 發佈於2025-04-18
  • 如何檢查對像是否具有Python中的特定屬性?
    如何檢查對像是否具有Python中的特定屬性?
    方法來確定對象屬性存在尋求一種方法來驗證對像中特定屬性的存在。考慮以下示例,其中嘗試訪問不確定屬性會引起錯誤: >>> a = someClass() >>> A.property Trackback(最近的最新電話): 文件“ ”,第1行, AttributeError: SomeClass...
    程式設計 發佈於2025-04-18
  • 如何在Java字符串中有效替換多個子字符串?
    如何在Java字符串中有效替換多個子字符串?
    在java 中有效地替換多個substring,需要在需要替換一個字符串中的多個substring的情況下,很容易求助於重複應用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    程式設計 發佈於2025-04-18
  • Python中何時用"try"而非"if"檢測變量值?
    Python中何時用"try"而非"if"檢測變量值?
    使用“ try“ vs.” if”來測試python 在python中的變量值,在某些情況下,您可能需要在處理之前檢查變量是否具有值。在使用“如果”或“ try”構建體之間決定。 “ if” constructs result = function() 如果結果: 對於結果: ...
    程式設計 發佈於2025-04-18
  • 如何使用不同數量列的聯合數據庫表?
    如何使用不同數量列的聯合數據庫表?
    合併列數不同的表 當嘗試合併列數不同的數據庫表時,可能會遇到挑戰。一種直接的方法是在列數較少的表中,為缺失的列追加空值。 例如,考慮兩個表,表 A 和表 B,其中表 A 的列數多於表 B。為了合併這些表,同時處理表 B 中缺失的列,請按照以下步驟操作: 確定表 B 中缺失的列,並將它們添加到表的...
    程式設計 發佈於2025-04-18
  • 如何在GO編譯器中自定義編譯優化?
    如何在GO編譯器中自定義編譯優化?
    在GO編譯器中自定義編譯優化 GO中的默認編譯過程遵循特定的優化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
    程式設計 發佈於2025-04-18
  • `javascript:void(0)`在網頁中的實際作用是什麼?
    `javascript:void(0)`在網頁中的實際作用是什麼?
    在“ javascript:void(void(0)”中解鎖謎語[ `````` 該操作員到底需要什麼? **了解空隙操作員** JavaScript中的無效操作員具有特殊的功能。當應用於表達式時,它會評估表達式並返回特殊值 - 未定義。 **為什麼在“ javascript:void(0)”中使...
    程式設計 發佈於2025-04-18
  • 為什麼在我的Linux服務器上安裝Archive_Zip後,我找不到“ class \” class \'ziparchive \'錯誤?
    為什麼在我的Linux服務器上安裝Archive_Zip後,我找不到“ class \” class \'ziparchive \'錯誤?
    Class 'ZipArchive' Not Found Error While Installing Archive_Zip on Linux ServerSymptom:When attempting to run a script that utilizes the ZipAr...
    程式設計 發佈於2025-04-18
  • 我可以將加密從McRypt遷移到OpenSSL,並使用OpenSSL遷移MCRYPT加密數據?
    我可以將加密從McRypt遷移到OpenSSL,並使用OpenSSL遷移MCRYPT加密數據?
    將我的加密庫從mcrypt升級到openssl 問題:是否可以將我的加密庫從McRypt升級到OpenSSL?如果是這樣,如何? 答案:是的,可以將您的Encryption庫從McRypt升級到OpenSSL。 可以使用openssl。 附加說明: [openssl_decrypt()函數要求...
    程式設計 發佈於2025-04-18
  • Python高效去除文本中HTML標籤方法
    Python高效去除文本中HTML標籤方法
    在Python中剝離HTML標籤,以獲取原始的文本表示 僅通過Python的MlStripper 來簡化剝離過程,Python Standard庫提供了一個專門的功能,MLSTREPERE,MLSTREPERIPLE,MLSTREPERE,MLSTREPERIPE,MLSTREPERCE,MLST...
    程式設計 發佈於2025-04-18
  • 如何將多種用戶類型(學生,老師和管理員)重定向到Firebase應用中的各自活動?
    如何將多種用戶類型(學生,老師和管理員)重定向到Firebase應用中的各自活動?
    Red: How to Redirect Multiple User Types to Respective ActivitiesUnderstanding the ProblemIn a Firebase-based voting app with three distinct user type...
    程式設計 發佈於2025-04-18
  • 如何在php中使用捲髮發送原始帖子請求?
    如何在php中使用捲髮發送原始帖子請求?
    如何使用php 創建請求來發送原始帖子請求,開始使用curl_init()開始初始化curl session。然後,配置以下選項: curlopt_url:請求 [要發送的原始數據指定內容類型,為原始的帖子請求指定身體的內容類型很重要。在這種情況下,它是文本/平原。要執行此操作,請使用包含以下標頭...
    程式設計 發佈於2025-04-18
  • 您可以使用CSS在Chrome和Firefox中染色控制台輸出嗎?
    您可以使用CSS在Chrome和Firefox中染色控制台輸出嗎?
    在javascript console 中顯示顏色是可以使用chrome的控制台顯示彩色文本,例如紅色的redors,for for for for錯誤消息? 回答是的,可以使用CSS將顏色添加到Chrome和Firefox中的控制台顯示的消息(版本31或更高版本)中。要實現這一目標,請使用以下...
    程式設計 發佈於2025-04-18

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3