2016-09-06 42 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的使用- 调试)使用它,您可以查明重建的原因。

相关问题