首頁  >  文章  >  後端開發  >  理解Makefile(以C語言為例)。

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

王林
王林原創
2024-07-17 01:18:02900瀏覽

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 $< -o $@
  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 $< -o $@

# Déclaration des cibles phony
.PHONY: all clean fclean re

# Nettoyage des fichiers objets
clean:
    rm -f $(OBJECTS)

# Nettoyage complet (fichiers objets et exécutable)
fclean: clean
    rm -f $(TARGET)

# Refaire la compilation
re: fclean all

良好實踐

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

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

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

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

為什麼要使用.PHONY?

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

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

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

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

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

結論

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

以上是理解Makefile(以C語言為例)。的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn