【发布时间】:2018-04-25 09:10:42
【问题描述】:
我想使用我在书中读到的模式规则将这个 makefile 更改为更简单的东西:
VPATH = src
CPPFLAGS = -I include
main.o: main.cpp
g++ $(CPPFLAGS) $<
TwoDimensionalShape.o: TwoDimensionalShape.cpp
g++ -c $(CPPFLAGS) $<
Square.o: Square.cpp Square.h
g++ -c $(CPPFLAGS) $<
Circle.o: Circle.cpp Circle.h
g++ -c $(CPPFLAGS) $<
Rectangle.o: Rectangle.cpp Rectangle.h
g++ -c $(CPPFLAGS) $<
Triangle.o: Triangle.cpp Triangle.h
g++ -c $(CPPFLAGS) $<
ShapeStack.o: ShapeStack.cpp ShapeStack.h
g++ -c $(CPPFLAGS) $<
ScreenManager.o: ScreenManager.cpp ScreenManager.h
g++ -c $(CPPFLAGS) $<
ScreenState.o: ScreenState.cpp ScreenState.h
g++ -c $(CPPFLAGS) $<
SquareState.o: SquareState.cpp SquareState.h
g++ -c $(CPPFLAGS) $<
CircleState.o: CircleState.cpp CircleState.h
g++ -c $(CPPFLAGS) $<
读完这本书后,我可以使用这样的模式规则编写上述内容。但我不明白它是如何工作的:
#source files are in "src" folder.
VPATH = src
#header files are in "include" folder.
CPPFLAGS = -I include -Wall
all: main.o TwoDimensionalShape.o Square.o Circle.o Rectangle.o Triangle.o ShapeStack.o ScreenManager.o ScreenState.o SquareState.o CircleState.o
g++ $(CPPFLAGS) $^
%.o: %.cpp
g++ -c $(CPPFLAGS) $<
%: %.o
g++ $<
这个 makefile 是正确的,但是我不明白它是如何工作的。
- 如果我更改例如 2 个源文件,这个 makefile 如何理解只编译更改的两个源文件而不是所有源文件?
- 在我阅读的书中,示例是关于 C 而不是 C++,最后一行是
%: %.c。那为什么我的%: %.o行还在工作?不应该是%: %.cpp吗?
【问题讨论】:
-
向后工作。查看您的 all 规则,将首先检查该规则。接下来,make 需要确定每个列出的
.o依赖项是否是最新的,因此它会查找匹配它们的规则,该规则始终是%.o: %.cpp规则。因此,它会查看main.cpp以确定main.o是否是最新的,并且对于其他每个人来说都是一样的 -
哦,用
-d运行它来调试你的makefile,这将显示它为每个文件考虑的规则 -
@jamek -
make是跨平台的。更改为 cmake 只会更改您要询问的工具,它不能解决任何问题。 -
如果正确设置
CXX和CXXFLAGS,就可以使用Make内置的%.o: %.cpp规则。您可以设置LINK.o = $(LINK.cc)以使用内置链接器规则。 Slim makefile 是更好的 makefile! -
@Jerome - 关于如何获得答案的建议是评论。只有实际答案才应作为答案发布。