4

很多时候,实际上大多数时候,Visual Studio2005 没有检测到某些 CPP 文件 C++ 项目中包含的某些标头已更改。因此,如果仅更改标题,它不会重新编译项目。

它不依赖于“预编译头”设置。它不会在 VS 2006 中发生,但在 VS 2005 和 VS 2008 的每个版本中都会发生。它发生在所有项目中,而不是某个特定项目。

如果头文件是项目的一部分,即如果它出现在 vcproj 文件中,则不会发生这种情况

解决此问题的唯一方法是执行干净的构建。

任何建议都非常感谢。

4

4 回答 4

3

大多数情况下(尤其是在 C 项目中)发生这种情况是因为“启用最小重建”项目设置。在“最小重建”模式下,VS2005 试图对需要重建的内容做出更精确的决定:不是基于修改了哪些头文件,而是基于修改了哪些单独的类定义。在 C 项目(相对于 C++ 项目)中,这种方法基本上 100% 的时间都失败了,即它完全忽略了修改过的头文件并且从不重建任何东西。很烦人。我不知道您正在构建什么样的项目,但也许它也可能在 C++ 项目中失败。

无论如何,尝试将“启用最小重建”设置为“否”。(这是一个项目设置,顺便说一句,不是全局 VS 设置)。这应该将 VS 恢复为传统的基于文件的重建行为。

于 2009-10-21T13:47:36.223 回答
2

首先,VS 只检查那些属于您项目的标头(包含在项目文件/文件树的一部分中)。

有一些头文件以非常特殊的方式处理,例如resource.h. 该文件在其开头有一个注释标记,将文件定义为非相关文件。在 SO 上查看我关于该问题的其他问题。

如果您使用最小重建编译器选项(/Gm,如果我没记错的话) ,VS 还会缓存类依赖项(哪个类在哪个标头中声明,哪个 cpp 使用哪个标头等)。有关更多详细信息,请参阅 /Gm 编译器设置上的此MSDN 页面

最小重建依赖于类定义在包含文件之间不发生变化。类定义对于项目必须是全局的(给定类应该只有一个定义),因为 .idb 文件中的依赖关系信息是为整个项目创建的。如果您的项目中有多个类的定义,请禁用最小重建。

另外,如果您使用强制包含项目设置,我不确定是否正确解决了依赖关系...

希望这有任何用处。

于 2009-10-21T13:31:26.597 回答
0

对于我们这些在 vs 2015、2017 和 2019(可能还有更多版本)中仍然存在此问题并尝试关闭预编译头文件、创建全新解决方案/项目(不复制任何内容)、禁用最小重建等的人。并且只想要一个有效的解决方案,并不意味着在每次测试运行之前手动运行干净或重建。

您可以通过蛮力修复:

转到项目属性

“自定义构建步骤”

“之前执行”并设置为“清洁”

我想知道我和其他人因为不知道 VS 实际上只是运行损坏的旧版本代码而没有实际修复代码的更改而忘记了多少东西?

于 2020-02-14T09:43:36.993 回答
0

我刚刚遇到了这个问题 - 结果我复制了一个 VS Project 文件夹(非常糟糕的主意)并继续处理我的项目副本。但是由于所有包含路径等仍然指向原始项目(愚蠢的 VS 使用绝对路径......),VS“没有检测到”标题更改,换句话说,正在查看错误的包含位置。

于 2019-03-21T14:43:14.813 回答