需要帮助了解Makefile模式规则%:%.o

Need help understanding makefile pattern rule % : %.o

本文关键字:规则 模式 Makefile 帮助 了解      更新时间:2023-10-16

我想使用我在书中阅读的模式规则更改为简单的内容:

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。那为什么我的行 %: %.o工作?不是%: %.cpp吗?

这个makefile是正确的,但是我不明白它是如何工作的。

如果您的新零件是旧的,那肯定是不起作用的。

在您拥有的"旧"中,例如。

ShapeStack.o: ShapeStack.cpp ShapeStack.h

告诉shapestack.o取决于.cpp和标头文件。您的新Makefile对其他文件没有任何依赖性,这会带来很多麻烦。只需触摸您的一个标题并类型制作即可。什么都不会发生!

因此,至少您必须像旧的makefile一样或使用更多自动机构来介绍源文件依赖项,也许是使用依赖关系检查的更多自动化,使用gcc,它与" gcc -mm"一起使用。

有关自动化先决条件,请参阅https://www.gnu.org/software/make/manual/html_node/automatic-prerequisites.html

使用vpath可能会带来很多麻烦。有一些工具,例如:http://make.mad-scientist.net/papers/how-not-not-to-use-vath/

可以在这里找到一些示例makefiles:最小C 为Linux

制作文件