簡體   English   中英

需要幫助來了解makefile模式規則%:%.o

[英]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是正確的,但是我不知道它是如何工作的。

  1. 如果我更改了例如2個源文件,那么該makefile如何理解僅編譯更改后的兩個源文件而不編譯所有源文件?
  2. 在我讀的書中,示例是關於C而不是C ++的,最后一行是%: %.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM