Вот ваша проблема:
%.o: $(SRCDIR)/%.cpp $(SRCDIR)/%.h
answer.o: answer.cpp answer.h
answer.o
зависит от $(SRCDIR)/answer.cpp
, $(SRCDIR)/answer.h
, answer.cpp
и answer.h
.Make не может найти их все.
Самый простой способ получить то, что вы хотите (при условии, что GNU Make) - это использовать VPATH
, чтобы заставить его искать $(SRCDIR)
для предварительных условий:
CXX = g++
CXXFLAGS += -std=c++14 -Wall -Wextra -pedantic -Wno-long-long
CXXFLAGS += -O0 -ggdb
LIBS += -lncurses
OBJECTS = answer.o handler.o main.o question.o quiz.o ui.o
OBJECTS += uiCreateQuiz.o uiImportExport.o uiPrinter.o uiSolveQuiz.o
VPATH = src
all: run
compile: quiz
quiz: $(OBJECTS)
quiz: LINK.o=$(LINK.cc)
run: quiz
valgrind ./quiz
clean:
$(RM) $(OBJECTS) quiz
answer.o: answer.cpp answer.h
handler.o: handler.cpp handler.h quiz.h question.h answer.h
main.o: main.cpp ui.h handler.h quiz.h question.h answer.h uiPrinter.h
main.o: uiSolveQuiz.h uiCreateQuiz.h uiImportExport.h
question.o: question.cpp question.h answer.h
quiz.o: quiz.cpp quiz.h question.h answer.h
ui.o: ui.cpp ui.h handler.h quiz.h question.h answer.h uiPrinter.h
ui.o: uiSolveQuiz.h uiCreateQuiz.h uiImportExport.h
uiCreateQuiz.o: uiCreateQuiz.cpp uiCreateQuiz.h handler.h quiz.h
uiCreateQuiz.o: question.h answer.h uiPrinter.h
uiImportExport.o: uiImportExport.cpp uiImportExport.h handler.h quiz.h
uiImportExport.o: question.h answer.h uiPrinter.h
uiPrinter.o: uiPrinter.cpp uiPrinter.h
uiSolveQuiz.o: uiSolveQuiz.cpp uiSolveQuiz.h handler.h quiz.h
uiSolveQuiz.o: question.h answer.h uiPrinter.h
(Я сделал несколько небольших улучшений - например, run
зависит от quiz
, или вы удивитесь, когда вы make -j run
, и я использовал стандартную переменную $(RM)
дляпортативность).