VS 2005未​​检测到C ++项目的头文件中的更改

时间:2009-10-21 12:54:11

标签: visual-studio visual-c++ visual-studio-2005 header-files

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

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

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

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

非常感谢任何建议。

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

首先,VS仅检查属于项目一部分的标题(包含在项目文件/文件树的一部分中)。

有一些头文件以非常特殊的方式处理,例如resource.h。此文件的开头有一个注释标记,用于将文件定义为非依赖项。在SO上查看我的other question about that issue

如果你使用 minimal rebuild 编译器选项(如果我没记错的话,还是/ Gm),VS还会缓存类依赖项(哪个类在什么标题中声明,cpp使用什么标题等等)? 。有关详细信息,请参阅此MSDN page on /Gm compiler setting

  

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

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

希望这有用。

答案 2 :(得分:0)

我只是遇到了这个问题-事实证明,我复制了VS Project文件夹(这是一个非常糟糕的主意),并继续进行项目的副本。但是由于所有包含路径等仍指向原始项目(使用绝对路径的愚蠢VS ...),因此VS“未检测到”标头更改,换句话说,是在寻找错误的包含位置。 / p>

答案 3 :(得分:0)

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

您可以通过蛮力来修复:

转到项目属性

“自定义构建步骤”

“先执行”,然后设置为“清理”

我想知道我和其他人由于不知道VS实际上只是在运行旧版本的代码而没有实际修复代码的更改而学到的东西呢?