Make 始终针对目标"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
来单独构建每个类Point
和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
我希望它说"Nothing to be done for 'all'."或类似的东西,就像它对其他目标一样。我错过了什么?
all
对输出文件Test
一无所知。因为它不知道任何特定的目标文件,所以它不能比较目标的时间戳和依赖项。这就是为什么它总是运行这个命令。您需要告诉make,通过all
,您实际上是要生成文件Test
。你可以这样做:
all : Test
Test : $(OBJS)
$(CXX) $(CXXFLAGS) $(OBJS) -o Test
除了这个问题,你还需要为Test.o
指定规则
猜测make的行为会浪费你很多宝贵的时间。我看到人们花了几个小时或几天的时间在无休止的重建循环中,每次都得到不同的结果。
这是好消息。几乎每一个make工具都有一个"explain"特性(gnu的make使用——debug),使用这个特性你可以确定重新构建的原因。
没有为Test.o
定义规则
相关文章:
- 从C++本机插件更新Vector3数组
- QGraphicsPolygonItem在拖动时未更新QPolygonF坐标
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何在不产生任何垃圾的情况下获得C中的像素
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- cmake更新缓存的变量
- 更新到莫哈韦后出现cmath错误
- C++映射有2个键,这样任何1个键都可以用来获取值
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- OpenMP:并行更新数组总是需要减少数组吗
- RtlCaptureStackBackTrace未捕获任何帧
- 为什么我的变量没有更新,我的 LED 没有亮起?
- 指针没有更新它在void函数内部指向的值
- 为什么字符串没有更新并且最终没有打印任何内容
- QTreeView:如果未键入任何内容,则不要更新索引
- 在运行时动态更新二进制文件(可执行文件)而不停止的任何类型的方法
- GNU 4.8.1系统更新后,任何C++编译都会崩溃
- Make 始终针对目标"all"运行,即使没有任何要更新的内容
- QThread在GUI事件上调用glBufferData()时不更新OpenGL vbo和不渲染任何东西