需要帮助了解makefile模式规则%:%。o

时间:2018-04-25 09:10:42

标签: c++ makefile

我想使用我在书中读到的模式规则将这个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是正确的,但我不明白它是如何工作的。

  1. 如果我更改了例如2个源文件,那么makefile如何理解只编译已更改的两个源文件而不是所有源文件?
  2. 在我读过的书中,示例是关于C而不是C ++,最后一行是%: %.c。那为什么我的%: %.o行正在工作?不应该是%: %.cpp

1 个答案:

答案 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