![](/img/trans.png)
[英]Makefile Pattern rule: Circular makefile.o <- makefile dependency dropped
[英]Need help understanding makefile pattern rule % : %.o
我想使用我在書中讀到的模式規則將此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
. %: %.c
。 那么為什么我的%: %.o
有效? 應該不是%: %.cpp
嗎? 這個makefile是正確的,但是我不知道它是如何工作的。
如果新的Makefile替代了舊的Makefile,則肯定無法正常工作。
在“舊”中,例如
ShapeStack.o: ShapeStack.cpp ShapeStack.h
這表明ShapeStack.o取決於.cpp和頭文件。 您的新Makefile與其他文件沒有任何依賴關系,這將導致很多麻煩。 只需觸摸您的標題之一並輸入make。 什么都不會發生!
因此,至少您必須引入源文件的依賴關系,也許像在舊的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-to-use-vpath/
可以在這里找到一些示例Makefile: Linux的最小c ++ make文件
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.