Cevapların çoğu şaşırtıcı derecede karmaşık veya hatalıdır. Ancak basit ve sağlam örnekler başka bir yerde yayınlanmıştır [ codereview ]. Kuşkusuz, gnu ön işlemcisi tarafından sağlanan seçenekler biraz kafa karıştırıcıdır. Ancak, tüm dizinlerin derleme hedefinden kaldırılması -MM
belgelenmiştir ve bir hata [ gpp ] değildir:
Varsayılan olarak CPP, ana girdi dosyasının adını alır, herhangi bir
dizin bileşenini ve '.c' gibi herhangi bir dosya sonekini siler ve platformun olağan nesne son ekini ekler.
(Biraz daha yeni) -MMD
seçeneği muhtemelen istediğiniz şeydir. Tamlık için, birden çok src dizinini destekleyen ve bazı yorumlarla dizinler oluşturan bir makefile örneği. Derleme dizinleri olmayan basit bir sürüm için bkz. [ 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)
Bu yöntem işe yarar çünkü tek bir hedef için birden fazla bağımlılık satırı varsa, bağımlılıklar basitçe birleştirilir, örneğin:
a.o: a.h
a.o: a.c
./cmd
eşdeğerdir:
a.o: a.c a.h
./cmd
belirtildiği gibi: Tek bir hedef için birden fazla bağımlılık satırı Makefile?