我想使用我在书中读到的模式规则将这个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是正确的,但我不明白它是如何工作的。
%: %.c
。那为什么我的%: %.o
行正在工作?不应该是%: %.cpp
?答案 0 :(得分:3)
这个makefile是正确的,但我不明白它是如何工作的。
如果你的新Makefile是旧的Makefile的替代品,它绝对不起作用。
在&#34; old&#34;你就有一个。
ShapeStack.o: ShapeStack.cpp ShapeStack.h
告诉ShapeStack.o依赖于.cpp和头文件。您的新Makefile与其他文件没有任何依赖关系会导致很多麻烦。只需触摸其中一个标题并输入make即可。什么都不会发生!
所以至少你必须介绍你的源文件依赖,可能是你的旧makefile中的手册,或者是一些使用编译器依赖性检查的更多自动操作,使用gcc它是&#34; gcc -MM&#34 ;
要获得自动先决条件,请参阅https://www.gnu.org/software/make/manual/html_node/Automatic-Prerequisites.html
使用vpath会导致很多麻烦。有一些清晰度,例如: http://make.mad-scientist.net/papers/how-not-to-use-vpath/
一些示例Makefiles可以在这里找到: minimum c++ make file for linux