【问题标题】:How does visual studio know which cpp files to rebuild when an include file is changed?当包含文件更改时,Visual Studio 如何知道要重建哪些 cpp 文件?
【发布时间】:2009-07-08 09:29:37
【问题描述】:

在我的一些 VS 2005 项目中,当我更改包含文件时,一些 cpp 文件不会重新构建,即使它们中有一个简单的 #include 行。

这是一个已知的错误,还是项目有什么奇怪的地方?是否有任何关于 VS 如何解决依赖关系的信息,我可以查看相关文件吗?

顺便说一句,我确实尝试了一些谷歌搜索,但找不到任何关于此的信息。我可能需要正确的搜索词...

【问题讨论】:

    标签: c++ visual-studio-2005 build include


    【解决方案1】:

    我不时遇到过这个问题,而且在其他 IDE 中也遇​​到过,而不仅仅是 VS。似乎他们的内部依赖树有时会与现实脱节。在这些情况下,我发现删除预编译的头文件(这很重要)并且完全重建总是可以解决问题。幸运的是,这种情况并不经常发生。

    【讨论】:

    • 是的,完全重建修复了它,但大约需要 40 分钟。我正在尝试在我的机器上进行无人值守的构建。
    • @danio:我记得有这样的问题。在这种情况下,我要么重新启动 Visual Studio,要么进行重建。为什么要全部重建?你不能只重建项目吗?
    • @ovanes 是的,仅重建有问题的项目会更快,但找出它们可能会很耗时。必须解密链接器错误以找出错误的库,重新构建每个库,然后重新构建解决方案并希望我已经全部捕获。
    【解决方案2】:

    说实话,我在使用 Visual Studio 时从未遇到过这样的问题。如果包含标题,您的 CPP 也应该重新构建。我能想到的唯一原因:相同的包含文件取自 2 个不同的来源。

    您可以尝试在编译时进行调试,方法是启用预处理器输出预处理文件。单击 CPP 文件转到属性,然后转到 C/C++->预处理器,然后在“生成预处理文件”中选择带或不带行号的项目。

    转到包含文件,将编译指示放在新添加的定义周围,例如:

    #pragma starting_definition_X
    ...
    #pragma ending_definition_X
    

    现在编译一切。将有一个新创建的文件,其名称与 CPP 相同,但扩展名为 .I(或 .i)。

    如果您的编译指示在那里,请进行搜索。如果不是,则您的包含来自其他地方。

    如果你使用预编译的头文件,你的 cpp 应该重建。 MS VC 中还有一个 pragma once 语句,它只解析一次包含文件,但它仍然应该重新编译你的 cpp 文件。

    希望对您有所帮助,
    风向标

    【讨论】:

    • 头文件都使用 #pragma once 或 #ifdef 保护,所以我认为这不是问题的原因。有趣的是可以存储预处理器输出:谢谢,将来可能会派上用场...
    • 是的,我在做某种类型的混合预处理器元编程和通用元编程时经常使用它。这是调试代码生成的唯一方法。好消息是您可以将任何 pragma 放在头文件或 cpp 文件中,然后在预处理文件中找到它们,因为预处理文件通常非常大,由于优化编译器分配了巨大的文件并插入扩展的包含,否则它每次在中间插入 smth 时都必须重新写入文件。由于 pragma 保留在 pp 文件中,您可以简单地搜索它们并找到您感兴趣的 sn-p。
    【解决方案3】:

    您是否打开了"Minimal rebuild" 选项?

    【讨论】:

    • 否,但似乎仍会生成 idb 文件。我会看看我能不能得到这些文件......
    【解决方案4】:

    Visual Studio 比较文件的时间戳。因此,您可能想检查您的系统时钟是否设置正确,并且所有文件都没有有趣的时间戳。查看包含文件、cpp 文件、pch 文件和 obj 文件,并确保所有时间戳看起来都合理。尤其要确保它们都不在未来。

    【讨论】:

    • 谢谢,但时间看起来还不错。 .h 比 .obj 新,而 .obj 比 .cpp 新。我们这里没有使用 pch。
    【解决方案5】:

    .h 文件是否添加到项目中?如果没有,那么 vs 可能无法找出依赖关系。

    【讨论】:

    • 不,他们不在项目中(不要问...)。不过,我认为这没有必要。
    【解决方案6】:

    感谢他们帮助我指明正确方向的所有答案。

    我发现删除 idb 文件并重新构建将允许后续修改 .h 文件以生成正确的 .cpp 文件。然而,这会导致整个项目被重建,这让我回到了 Neil Butterworth 的建议,即进行全面重建。我认为我对此无能为力。

    顺便说一句,查看坏和好 idb 文件,我可以看到未构建的 cpp 文件不在坏 idb 中,而在好 idb 中。两个文件中多次提到了正在更改的头文件。

    win_pdbx (download) 可以提取 idb 文件,moyix 已发布 some information 关于这些文件中的流。 Stream 4 包含 cpp 文件的文件路径,但我无法确定格式。

    【讨论】:

      猜你喜欢
      • 2018-10-21
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-30
      • 1970-01-01
      相关资源
      最近更新 更多