C++ “始终为目标跑步”;全部;,即使有';没有什么要更新的

C++ “始终为目标跑步”;全部;,即使有';没有什么要更新的,c++,makefile,C++,Makefile,我有这些文件 Test.cpp h点 Point.cpp 三角形 三角形.cpp 我希望有一个makefile,允许我在需要时通过发出makepoint或maketriangle分别构建Point和Triangle类(头文件或源文件已更改)makeall应编译所有内容,并在需要时生成输出程序Test 这就是我到目前为止的想法: CXX=g++ CXXFLAGS=-std=c++11 -Wall -pedantic OBJS=Test.o Point.o Triangle.o all : $

我有这些文件

  • Test.cpp
  • h点
  • Point.cpp
  • 三角形
  • 三角形.cpp
我希望有一个makefile,允许我在需要时通过发出
makepoint
maketriangle
分别构建
Point
Triangle
类(头文件或源文件已更改)
makeall
应编译所有内容,并在需要时生成输出程序
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

我希望它说一些类似于“对‘所有’都不做任何事情”或类似的话,就像它对其他目标所做的那样。我缺少什么?

没有为
测试定义规则。o
所有
对输出文件
测试
一无所知。因为它不知道任何特定的目标文件,所以不能比较目标文件和依赖文件的时间戳。这就是为什么它总是运行命令。您需要通过
all
告诉make您实际上想要生成文件
Test
。您可以这样做:

all : Test

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

除此之外,您还需要为
测试指定规则。o

猜测make的行为将为您浪费大量宝贵的时间。我曾看到人们在无休止的重建周期中花费数小时/天,每一次重建都会产生不同的结果


这是好消息。几乎每个make工具都有一个“解释”功能(gnu的make使用--debug),使用该功能,您可以查明重建的原因。

检查以查看该Test.o是否比Test.cpp更新的内置规则就足够了吗?他的“全部”取决于“Test.o Point.o Triangle.o”。一旦创建了这些,重复的构建不应该跳过这个过程吗?@blackpen不,这样不行
all
不是真正的目标,它没有可以比较时间戳的实际文件。是的,当然。“all”不存在,因此它的时间戳也不存在。所以,它重新点燃了。非常感谢你的提示。我刚刚花了比我愿意承认的多得多的时间尝试了各种命令行选项,希望其中一个能像
--debug
那样做