c++ - Make 始终针对目标 "all"运行,即使没有任何更新

标签 c++ makefile

我有这些文件

  • 测试.cpp
  • 点.h
  • 点.cpp
  • 三角形.h
  • 三角形.cpp

我想要一个 makefile,它允许我通过发出 make Point 分别构建每个类 PointTriangle code>make 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

我希望它说出类似“'所有人'无事可做”之类的话。或类似的东西,就像它对其他目标所做的那样。我错过了什么?

最佳答案

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/

相关文章:

c++ - 我正在制作这个程序,服务器不会发送给客户端

c++ - 废话实例化

c++ - 为什么我必须两次运行 make 才能完全编译我的程序? GNU C++

c++ - 将 std::vector 扩展为具有 NULL 对象的动态数组

c++ - 为什么我的 C++ 圆抗锯齿算法会给出不对称的结果?

linux - 无法将 ‘const timeval’ 转换为 ‘__time_t {aka long int}’

c++ - 如何忽略使用 buildrpm 自动添加的编译器标志

c++ - 链接未在 Makefile 中完成

c++ - 如何在windows下制作superlu

c++ - 为什么 CMake 在 Ubuntu 18.04 上找不到我的 Boost 库?