簡體   English   中英

即使沒有任何更新,也始終為目標“all”運行

[英]Make always runs for target “all”, even when there's nothing to update

我有這些文件

  • TEST.CPP
  • Point.h
  • Point.cpp
  • Triangle.h
  • Triangle.cpp

我希望有一個makefile,允許我通過發出make Point或在需要時生成make Triangle (標題或源文件已更改)分別構建PointTriangle類。 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

我希望它能說“沒有什么可以為'所有'做的事。” 或類似的東西,就像它對其他目標一樣。 我錯過了什么?

all都對輸出文件Test一無所知。 由於它不知道任何特定的目標文件,因此無法比較目標和依賴項的時間戳。 這就是為什么它總是運行命令。 你需要告訴做出的all ,你其實是要生成的文件Test 你可以這樣做:

all : Test

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

Test.o問題外,您還需要為Test.o指定規則。

化妝的行為會浪費很多寶貴的時間為您服務。 我看到人們在無休止的重建周期中花費數小時/天,每個人都會得到不同的結果。

這是個好消息。 幾乎每個make工具都有一個“解釋”功能(gnu的make使用--debug ),您可以使用它來查明重建的原因。

沒有為Test.o定義規則。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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