【问题标题】:Makefile always thinks project is up to date - but files don't even existMakefile 总是认为项目是最新的 - 但文件甚至不存在
【发布时间】:2023-03-13 21:52:01
【问题描述】:

我有以下生成文件:

CCC = g++
CCFLAGS = -ansi

驱动程序:driver.o graph.o
        $(CCC) -o 驱动程序 driver.o graph.o

图.o:图.h
驱动程序.o:graph.h

形容词:
        rm -f graph.h graph.cc
        ln -s adjl/graph.cc 。
        ln -s adjl/graph.h 。
        触摸图.cc graph.h
形容词:
        rm -f graph.h graph.cc
        ln -s adjm/graph.cc 。
        ln -s adjm/graph.h 。
        触摸图.cc graph.h

干净的:
        rm -f *.o
real_clean:干净
        rm -f graph.cc graph.h
        rm -f 驱动程序

我的想法是我试图根据我想要使用的实现来链接两个不同的 .cc/.h 文件。如果我制作 real_clean,则不存在任何 .cc/.h 文件,我只有一个 driver.cc 文件和文件夹中的 makefile。如果我打电话给make,它说它们是最新的。即使我编辑 adjl/adjm 中的文件以使其成为“更新”版本,也会发生这种情况。

 [95]% ls
adjl/ adjm/ driver.cc 生成文件
 [96]% 制作 adjl
make: `adjl' 是最新的。
 [97]% 调整
make: `adjm' 是最新的。

我从我做过的另一个项目中获取了模板 makefile,它们的编写方式相同,但我可以重复执行相同的命令而不会出现“最新”问题。

我用谷歌搜索过,但没有发现与我类似的问题(他们通常似乎涉及在制作前不清洁的用户)。

感谢大家的阅读。

【问题讨论】:

  • 确实,make 和 real_clean 都可以工作。
  • 我明白你的意思,但它确实有效。我刚刚从以前的课程中复制了一个 makefile,它可以工作,但是我对它们如何工作的理解非常渺茫。
  • make 具有隐式规则(例如,调用 c++ 编译器从 .cc 生成 .o),这就是为什么 driver.o 没有其他行的原因,例如但是,必须明确声明对.h 的依赖(因为make 不会从源文件中推断出它)。
  • @lijie 非常感谢您的解释。

标签: c++ makefile


【解决方案1】:

问题是您的目录与 Makefile 中的目标名称相同。

当您发出make adjl 时,请检查文件adjl,它会找到并且什么都不做。 将目标重命名为其他名称,然后重试。

【讨论】:

    【解决方案2】:

    adjladjm 目标是真正的目标。由于它们没有依赖关系,并且文件存在(列表中的 2 个目录),因此 make 不会做任何事情(因为它们就在附近)。

    但是,您想要将adjladjm 指定为虚假目标(以便在您指定它们时执行命令)。为此,

    .PHONY: adjl adjm
    

    阅读http://www.gnu.org/software/automake/manual/make/Phony-Targets.html了解更多信息。

    编辑

    事实上,real_cleanclean 规则也应该是假的。

    【讨论】:

    • 解决了我的问题,谢谢。我仍然对为什么我的旧 makefile(没有 .PHONY 行)起作用感到困惑。在我看来,它们在结构上看起来是相同的。我会阅读链接,感谢您的帮助。
    • 如果文件不存在,那么规则(如果直接/间接调用)将被执行(因为它不存在)。如果没有创建文件,则每次调用规则时,它将执行(因为它仍然不存在)。这可能就是它起作用的原因。这也是“real_clean”适用于您的情况的原因。
    【解决方案3】:

    您的目录与您的目标同名。

    由于您的目标不依赖于任何东西,它们将始终被认为是最新的。

    当指定一个未链接到磁盘上文件的目标时,您需要使用特殊目标.PHONY

    .PHONY: adjl adjm
    

    您也应该对您的 clean 和 real_clean 目标执行相同的操作 - 否则如果有人创建了一个名为“clean”的文件,它们就会中断。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-28
      • 2023-03-12
      • 1970-01-01
      相关资源
      最近更新 更多