我有这些文件
- 测试.cpp
- 点.h
- 点.cpp
- 三角形.h
- 三角形.cpp
我想要一个 makefile,它允许我通过发出 make Point
或 分别构建每个类
在需要时(头文件或源文件已更改)。 Point
和 Triangle
code>make Trianglemake 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
我希望它说出类似“'所有人'无事可做”之类的话。或类似的东西,就像它对其他目标所做的那样。我错过了什么?
最佳答案
all
对输出文件 Test
一无所知。由于它不知道任何特定的目标文件,因此无法比较目标和依赖项的时间戳。这就是为什么它总是运行命令。您需要通过 all
告诉 make 您实际上是要生成文件 Test
。你可以这样做:
all : Test
Test : $(OBJS)
$(CXX) $(CXXFLAGS) $(OBJS) -o Test
除此问题外,您还需要为 Test.o
指定规则。
关于c++ - Make 始终针对目标 "all"运行,即使没有任何更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39342194/