คำตอบส่วนใหญ่ซับซ้อนหรือผิดพลาดอย่างน่าประหลาดใจ อย่างไรก็ตามมีการโพสต์ตัวอย่างที่เรียบง่ายและมีประสิทธิภาพไว้ที่อื่น [ codereview ] เป็นที่ยอมรับว่าตัวเลือกที่มีให้โดยตัวประมวลผลล่วงหน้า gnu นั้นค่อนข้างสับสน อย่างไรก็ตามการลบไดเร็กทอรีทั้งหมดออกจากเป้าหมายการสร้างด้วย-MM
มีการบันทึกไว้และไม่ใช่ข้อผิดพลาด [ gpp ]:
โดยค่าเริ่มต้น CPP จะใช้ชื่อของไฟล์อินพุตหลักลบ
ส่วนประกอบไดเร็กทอรีและส่วนต่อท้ายไฟล์เช่น ".c" และต่อท้ายอ็อบเจ็กต์ตามปกติของแพลตฟอร์ม
-MMD
ตัวเลือก(ค่อนข้างใหม่กว่า) น่าจะเป็นสิ่งที่คุณต้องการ เพื่อความสมบูรณ์ตัวอย่างของ makefile ที่รองรับ src dirs หลาย ๆ ตัวและ build dirs พร้อมความคิดเห็นบางส่วน สำหรับเวอร์ชันธรรมดาที่ไม่มีบิวด์ไดร์โปรดดู [ codereview ]
CXX = clang++
CXX_FLAGS = -Wfatal-errors -Wall -Wextra -Wpedantic -Wconversion -Wshadow
BIN = mybin
BUILD_DIR = ./build
CPP = main.cpp $(wildcard dir1/*.cpp) $(wildcard dir2/*.cpp)
OBJ = $(CPP:%.cpp=$(BUILD_DIR)/%.o)
DEP = $(OBJ:%.o=%.d)
$(BIN) : $(BUILD_DIR)/$(BIN)
$(BUILD_DIR)/$(BIN) : $(OBJ)
mkdir -p $(@D)
$(CXX) $(CXX_FLAGS) $^ -o $@
-include $(DEP)
$(BUILD_DIR)/%.o : %.cpp
mkdir -p $(@D)
$(CXX) $(CXX_FLAGS) -MMD -c $< -o $@
.PHONY : clean
clean :
-rm $(BUILD_DIR)/$(BIN) $(OBJ) $(DEP)
วิธีนี้ใช้ได้ผลเพราะหากมีบรรทัดการอ้างอิงหลายบรรทัดสำหรับเป้าหมายเดียวการอ้างอิงจะถูกรวมเข้าด้วยกันเช่น:
a.o: a.h
a.o: a.c
./cmd
เทียบเท่ากับ:
a.o: a.c a.h
./cmd
ตามที่กล่าวไว้ที่: Makefile หลายบรรทัดการอ้างอิงสำหรับเป้าหมายเดียว?