【问题标题】:Makefile compiles all files, even though changes are done in a single c++ fileMakefile 编译所有文件,即使更改是在单个 c++ 文件中完成的
【发布时间】:2013-08-29 13:04:04
【问题描述】:

我从事涉及大量c++ 文件的项目。我是出于好奇才问这个问题的。

通常在完成make 之后,将单独编译正在修改的特定c++ 文件以供后续makes 使用。有时我会在单个 c++ 文件中遇到一个小的修改,结果编译几乎所有其他 c++ 文件和最终的可执行文件。

Makefile编译其他未修改的c++文件的原因是什么?

【问题讨论】:

  • 目标依赖。考虑在 just 该目标上运行 make,然后运行测试 make 以查看为什么所有其他文件突然不符合它们的规则。在没有看到 makefile 的情况下,其他任何事情都是纯粹的猜测。
  • 我用作廉价替代品的透明塑料球说它可能是您的 makefile 中的第 17、43 或 68 行错误。但是我的塑料球经常不正确,所以我不会太在意。如果您发布您的 makefile 可能会更好 - 或者更好的是,制作它的简单版本(但确保它仍然存在相同的问题)然后发布。
  • @MatsPetersson 我很嫉妒。我的塑料球通常很雾;一个真正的混蛋,可以从中得到任何东西。你说的很清楚让我很难过=(
  • 我自己的塑料球告诉我,我需要缓存和 MySQL,我可以像谷歌一样,做得更好。
  • 此类事情的另一个常见原因是时间戳偏差和 NFS。如果您的系统时钟关闭,它可能会导致 make 认为源文件比生成的文件更新并意外重建。

标签: c++ c makefile


【解决方案1】:

所以makefile 中的timestamping 的概念就出现了。比如说make规则是这样的

output: dep1
     rule-1
dep1: dep2
     rule-2

当您执行makefile 时,make 首先检查output 文件的timestamp(如果output 文件不存在,则默认情况下执行该规则)。假设output 是在 1200 小时创建的,您在 1205 小时更改文件 dep1 并执行make,然后make 发现目标输出早于其依赖关系dep1,因此它将执行规则1。如果假设output 在 1300 时创建,dep1 在 1230 时创建,现在您在 1310 时更新dep2,并执行make。您可以在这里看到,因为dep1 早于dep2 规则2 已执行,dep1 的时间戳已更改,output 现在早于dep1,因此执行规则1。即使output 不直接依赖于dep2,您也可以在此处看到它会在您更新dep2 时重建

这就是您的情况。检查makefile 并尝试检查您编辑的文件的依赖关系。将重建依赖于您编辑的文件的目标。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-02
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多