為了編寫一個Makefile檔案來自動化編譯一個專案,我們需要知道專案中包含哪些原始檔以及它們是如何組織的。假設我們有一個簡單的專案,它包含兩個C原始檔main.c
和helper.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
。