2016-09-06 41 views
4

我有這些文件製作始終運行爲目標 「所有」,即使沒有什麼更新

  • Test.cpp的
  • Point.h
  • Point.cpp
  • Triangle.h
  • Triangle.cpp

我想要一個makefile,允許我構建每個類PointTriangle分別通過在需要時發佈make Pointmake Triangle(頭文件或源文件已更改)。如果需要,make all應編譯所有內容並構建輸出程序Test

這就是我來了這麼遠:

CXX=g++ 
CXXFLAGS=-std=c++11 -Wall -pedantic 
OBJS=Test.o Point.o Triangle.o 

all : $(OBJS) 
    $(CXX) $(CXXFLAGS) $(OBJS) -o Test 


Point.o : Point.cpp Point.h 
    $(CXX) $(CXXFLAGS) -c Point.cpp 

Point : Point.o 


Triangle.o : Triangle.h Triangle.cpp Point.h 
    $(CXX) $(CXXFLAGS) -c Triangle.cpp 

Triangle : Triangle.o 


clean: 
    \rm *.o Test 


.PHONY : Point Triangle 

看來工作,但問題是,當我運行make all(或只是make)多次運行,即使沒有命令已經改變,給出以下輸出:

g++ -std=c++11 -Wall -pedantic Test.o Point.o Triangle.o -o Test 

我希望它能說出類似於「沒有任何事情要爲'全部'」。或類似的東西,就像其他目標一樣。我錯過了什麼?

回答

5

all對輸出文件Test一無所知。由於它不知道任何特定的目標文件,因此無法比較目標和依賴關係的時間戳。這就是爲什麼它總是運行命令。您需要通過all來告訴make您實際上是否想要生成文件Test。從這個問題您還需要爲Test.o指定規則

all : Test 

Test : $(OBJS) 
    $(CXX) $(CXXFLAGS) $(OBJS) -o Test 

除了:你可以做這樣的事情。

+0

他的「全部」取決於「Test.o Point.o Triangle.o」。一旦創建了這些內容,重複構建不應該跳過該過程嗎? – blackpen

+0

@blackpen不,它不會那樣工作。 'all'不是一個真正的目標,它沒有一個可以比較時間戳的實際文件。 – taskinoor

+0

是的,當然。 「全部」不存在,因此時間戳也不存在。所以,它重新啓動。 – blackpen

1

沒有規定爲Test.o定義的規則。

+0

不應該檢查看到Test.o比Test.cpp更新的內置規則是否足夠呢? – blackpen

1

的猜測行爲會使會浪費你很多寶貴的時間。我看到人們在無數的重建週期中花費數小時/天,每次都會有不同的結果。

這是個好消息。幾乎每使工具具有「解釋」功能(gnu的使用- 調試)使用它,您可以查明重建的原因。

相關問題