編寫一個 Makefile 檔案,對階段專案一的程式碼進行自動化編譯

freeangel123發表於2024-06-14

為了編寫一個Makefile檔案來自動化編譯一個專案,我們需要知道專案中包含哪些原始檔以及它們是如何組織的。假設我們有一個簡單的專案,它包含兩個C原始檔main.chelper.c,以及一個標頭檔案helper.h。我們希望編譯這些檔案生成一個名為project的可執行檔案。

以下是一個簡單的Makefile示例,它定義瞭如何編譯這個專案:

makefile

# 定義編譯器和編譯選項
CC=gcc                       #`CC` 變數定義了使用的編譯器,這裡預設為 `gcc`/`arm-linx-gcc`
CFLAGS=-Wall -Wextra -g      #`CFLAGS` 變數定義了編譯選項,例如 `-Wall` 和 `-Wextra` 用於啟用額外的警告,`-g` 用於生成除錯資訊

# 定義目標可執行檔名
TARGET=project             #`TARGET` 變數定義了最終生成的可執行檔名

# 定義原始檔列表
SOURCES=main.c helper.c    #`SOURCES` 變數列出了所有原始檔

# 定義目標檔案列表
OBJECTS=$(SOURCES:.c=.o)   #`OBJECTS` 變數透過模式替換從原始檔列表生成物件檔案列表

# 預設目標
all: $(TARGET)             #`all` 目標是預設目標,它依賴於 `$(TARGET)`,即專案可執行檔案

# 編譯目標
$(TARGET): $(OBJECTS)      #`$(TARGET): $(OBJECTS)` 規則定義瞭如何將物件檔案連結成最終的可執行檔案
	$(CC) $(OBJECTS) -o $(TARGET) $(LDFLAGS)

# 編譯每個原始檔為物件檔案
%.o: %.c                   #`%.o: %.c` 規則定義瞭如何將每個 `.c` 檔案編譯成 `.o` 檔案
	$(CC) $(CFLAGS) -c $< -o $@

# 清理編譯生成的檔案
clean:                     #`clean` 目標用於刪除所有編譯生成的檔案
	rm -f $(OBJECTS) $(TARGET)

# 重新構建專案
rebuild: clean all         #`rebuild` 目標首先執行 `clean`,然後重新構建專案

# 列印幫助資訊
help:                      #help` 目標用於列印幫助資訊
	@echo "Available targets:"
	@echo "  all       - Build the project"
	@echo "  clean     - Remove all generated files"
	@echo "  rebuild   - Clean and rebuild the project"
	@echo "  help      - Print this help message"

要使用這個Makefile,只需將其儲存為 Makefile 檔案,並在包含該檔案的目錄中開啟終端,然後輸入 make 命令來編譯專案。如果需要幫助,可以輸入 make help

相關文章