首页 > 解决方案 > Makefile:src 目录中的所有 .cpp 和 .h 文件

问题描述

我正在努力创建一个可以与一个 src 目录中的所有 .cpp 和 .h 文件一起使用的生成文件。我发现了许多关于 makefile 和目录的已回答问题,但它们都有一个非常复杂的目录结构,所以我并没有真正从这些问题中得到答案。到目前为止,我有这个:

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.

我应该改变什么才能使这项工作?

标签: c++makefile

解决方案


这是你的问题:

%.o: $(SRCDIR)/%.cpp $(SRCDIR)/%.h

answer.o: answer.cpp answer.h

answer.o取决于$(SRCDIR)/answer.cpp,和. $(SRCDIR)/answer.h_ 使无法找到它们。answer.cppanswer.h

获得你想要的东西(假设 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)变量来实现可移植性)。


推荐阅读