需要帮助了解Makefile模式规则%:%.o
Need help understanding makefile pattern rule % : %.o
我想使用我在书中阅读的模式规则更改为简单的内容:
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
。那为什么我的行%: %.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
相关文章:
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 此代码是否违反一个定义规则
- 为什么在保护模式下继承升级不起作用
- 如何在全屏模式下(在OpenGL中)使背景透明
- 生成文件不对文件使用隐式规则
- 生成文件匹配规则和配方中的模式
- 需要帮助了解Makefile模式规则%:%.o
- 生成文件:子目录的模式规则
- NMake 模式规则
- 将Javascript正则表达式模式转换为C++std::regex的规则
- 错误:"混合的隐式和静态模式规则"在我的生成文件中
- Makefile:已忽略模式规则
- 具有混合依赖项的生成文件模式规则
- 如何在makefile中扩展模式规则
- 如何编写模式规则来分隔对象文件和源文件的位置
- 是否存在用于在子类的数据上实施规则的设计模式
- 生成文件模式规则:循环生成文件.o < - 删除生成文件依赖项
- 生成文件模式规则差异
- 使用stack,编写一个程序,该程序使用以下规则确定字符模式是否有效:a ^N B^N
- 如何使用std::string的值作为Flex规则的模式