Makefile: все файлы .cpp и .h в каталоге src - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь создать make-файл, который бы работал со всеми файлами .cpp и .h в одном каталоге src.Я нашел множество ответов на вопросы о make-файле и каталогах, но все они имели очень сложную структуру каталогов, поэтому я не получил от них ответа.Пока у меня есть это:

CXX=g++
LD=g++
CXXFLAGS=-Wall -pedantic -std=c++14 -Wno-long-long -O0 -ggdb
LDLIBS=-lncurses

SRCDIR=src
OBJECTS=answer.o handler.o main.o question.o quiz.o ui.o uiCreateQuiz.o uiImportExport.o uiPrinter.o uiSolveQuiz.o

all: quiz run

compile: quiz

quiz: $(OBJECTS)
    $(LD) $^ $(LDLIBS) -o $@

%.o: $(SRCDIR)/%.cpp $(SRCDIR)/%.h
    $(CXX) $(CXXFLAGS) $(LDFLAGS) -c -o $@ $<

run:
    valgrind ./quiz

clean:
    rm -f $(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 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 uiSolveQuiz.h uiCreateQuiz.h uiImportExport.h
uiCreateQuiz.o: uiCreateQuiz.cpp uiCreateQuiz.h handler.h quiz.h question.h answer.h uiPrinter.h
uiImportExport.o: uiImportExport.cpp uiImportExport.h handler.h quiz.h question.h answer.h uiPrinter.h
uiPrinter.o: uiPrinter.cpp uiPrinter.h
uiSolveQuiz.o: uiSolveQuiz.cpp uiSolveQuiz.h handler.h quiz.h question.h answer.h uiPrinter.h

результат:

make: *** No rule to make target 'answer.cpp', needed by 'answer.o'.  Stop.

Что я должен изменить, чтобы сделать эту работу?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Вот ваша проблема:

%.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) дляпортативность).

0 голосов
/ 24 мая 2018

Вот моя структура make-файла, которую я разработал за эти годы:

CXX=g++
CFLAGS=-c -Wall -Wextra -Weffc++
LDFLAGS=-lall_my_libs    
SOURCES= \
    all/my/cpp/files.cpp \
    ...

OBJECTS=$(SOURCES:src/%.cpp=bin/%.o)
DEPS=$(OBJECTS:bin/%.o=bin/%.d)

all: my_binary

-include $(DEPS)

my_binary: $(OBJECTS)
    $(CXX) -o $@ $(OBJECTS) $(LDFLAGS)

bin/%.o: src/%.cpp
    $(CXX) -MD $(CFLAGS) -o $@ $<

clean:
    rm -rf bin/*.o bin/*.d my_binary

Вы можете хранить исходные файлы в каталоге src.и двоичные файлы помещаются в каталог bin.

О включаемых файлах: pption компилятора -MD генерирует файлы зависимостей (* .d), которые могут быть включены с помощью опции -include $(DEPS).Таким образом, вам больше не придется о них беспокоиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...