即使没有任何更新,也始终为目标“all”运行

时间:2016-09-06 06:44:05

标签: c++ makefile

我有这些文件

  • 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

我希望它能说“没有什么可以为'所有'做的事。”或类似的东西,就像它对其他目标一样。我错过了什么?

3 个答案:

答案 0 :(得分:5)

all对输出文件Test一无所知。由于它不了解任何特定的目标文件,因此无法比较目标和依赖项的时间戳。这就是为什么它总是在运行命令。您需要告诉make all您实际上要生成文件Test。你可以这样做:

all : Test

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

除此问题外,您还需要为Test.o指定规则。

答案 1 :(得分:1)

没有为Test.o定义规则。

答案 2 :(得分:1)

猜测 make 的行为会浪费你很多宝贵的时间。我看到人们在无休止的重建周期中花费数小时/天,每个人都会得到不同的结果。

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