c++ - 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.
我应该改变什么才能使这项工作?
解决方案
这是你的问题:
%.o: $(SRCDIR)/%.cpp $(SRCDIR)/%.h
answer.o: answer.cpp answer.h
answer.o
取决于$(SRCDIR)/answer.cpp
,和. $(SRCDIR)/answer.h
_ 使无法找到它们。answer.cpp
answer.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)
变量来实现可移植性)。
推荐阅读
- ssl - 如何禁用 SSL 2.0 和 3.0
- powerbi - 从字符串中提取域名
- c# - 无法在服务中检测到计算机睡眠
- javascript - 使用打字稿前端应用程序加载外部库
- quanteda - Quanteda 语料库分段文档
- office365 - 启用 2 因素身份验证后丢失 Office 365 开发人员管理员帐户
- javascript - ReactJS - 事件未定义,它不会呈现 onChange 事件?
- angular - Jest Angular svg 模板
- scala - 使用 ScalaTest 测试 Scala 应用程序
- node.js - 为什么libuv的线程池会导致不可恢复的灾难性内存碎片?