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

Mag*_*s W 4 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
Run Code Online (Sandbox Code Playgroud)

它似乎工作,但问题是,当我运行make all(或只是make)多次运行命令,即使没有任何变化,给出以下输出:

g++ -std=c++11 -Wall -pedantic Test.o Point.o Triangle.o -o Test
Run Code Online (Sandbox Code Playgroud)

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

tas*_*oor 5

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

all : Test

Test : $(OBJS)
    $(CXX) $(CXXFLAGS) $(OBJS) -o Test
Run Code Online (Sandbox Code Playgroud)

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


bla*_*pen 5

猜测make的行为会浪费你很多宝贵的时间。我见过人们花费数小时/数天进行无休止的重建循环,每个品牌都会产生不同的结果。

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