为什么Visual Studio 2008总是重建我的整个项目?

时间:2009-06-20 20:33:55

标签: visual-studio rebuild

我有一个包含大约60个C ++源文件的Visual Studio项目。我可以做一个构建,它完成没有错误。但如果我再次立即点击F7,它总是会重新编译大约50个源文件。它不会重新编译所有文件,这很奇怪。

我有'启用最小重建'(/ Gm)设置。有什么想法可能会这样做吗? 这些文件以后都没有修改日期。

17 个答案:

答案 0 :(得分:8)

将来您的任何文件日期都是?如果更改了时区或更改了系统时钟时间,则会发生这种情况。将来日期会混淆IDE并在每次F7或F5命中时强制重建。

答案 1 :(得分:5)

最有可能是依赖性问题。

考虑以下可能性:

  • 如果您为解决方案中的某些文件定义了自定义构建工具,请确保output属性包含正确的文件名。如果构建工具的输出与输出文件名中指定的输出不对应,则构建器将重建该文件。

  • 如果您有自定义构建事件,请检查这些构建事件的输出是否不影响要构建的文件的依赖关系。

  • 在构建后,尝试将某些输出文件复制或移动到构建文件夹时遇到问题。影响构建过程的输出文件的时间戳的后期构建操作将每次确定重建。

答案 2 :(得分:4)

项目属性 - > “C / C ++” - > “输出文件” - > “程序数据库文件名”选项不应为空。通过从下拉框中选择来设置此选项。该选项将设置如下:$(IntDir)\ vc90.pdb。并且将从vcproj文件中删除行ProgramDataBaseFileName =“”。

然后,在构建项目或解决方案时,只会重新编译已更改的* .cpp文件。

答案 3 :(得分:4)

在我的情况下(C ++通过VS2005),它仅在Release配置上,并且Studio在构建输出中告知,如果未设置/ Zi - 选项,则忽略编译器选项/ Gm。设置/ Zi后

配置属性 - > C / C ++ - >一般 - >调试信息格式:程序数据库(/ Zi),

没关系。但是,当发布配置需要一些关于调试的东西时,是不是有问题?我还不清楚!

答案 4 :(得分:3)

经过几天的谷歌搜索,我最终解决了我的问题。

当我将项目移动到新PC时,我遇到了这个问题。我已经多次检查过文件的创建日期。这些日期是最新的,但即使我更改了文件,修改日期仍然在麻烦(有点怪异)。

文件的简单更新解决了这个问题。

答案 5 :(得分:3)

似乎这个问题可能是由许多事情引起的,但是为我解决的问题是:

  1. 关闭Visual Studio
  2. 手动删除所有 binobj个文件夹(Clean似乎没有办法)
  3. 打开解决方案并运行Clean(我不确定这是否有必要,但我是为了以防万一...)
  4. 正常建设
  5. 注意:这是针对Visual Studio 2010中的C#程序。

答案 6 :(得分:3)

我遇到了同样的问题,似乎是因为我关闭了浏览信息。属性 - > C / C ++ - >浏览信息 - >启用浏览信息 - >无。我发现的唯一解决办法是重新开启它。这是一个xbox 360项目,fwiw,我的其他项目没有问题。

答案 7 :(得分:2)

原因是,如果将来某个源文件的“最后修改日期”设置为某个日期:它会重建,然后源文件仍然晚于可执行文件。

如果源文件位于远程计算机(网络共享)的目录中,则可能发生日期问题,和/或如果计算机的时间与计算机的日期不同步,则可能会发生此问题运行源版本控制系统的服务器。

答案 8 :(得分:1)

检查您的项目是否包含磁盘上不存在的任何.h头文件。当我删除一个我实际上并不包含在任何地方的头文件时总是发生在我身上,但忘记将其从VS中的解决方案导航器中删除。注意:缺少的标题在构建期间不会产生错误(在任何地方都不包含#include)。

答案 9 :(得分:1)

检查项目的程序数据库文件名设置。出于某种原因,如果将其设置为目录的名称(例如"$(IntDir)\"),则有时会导致VS每次重建项目,即使您没有生成PDB文件(即调试信息格式)设置为“已禁用”。)

这是VS2008中的一个错误;我还没有在VS2010中再现它,但是我的测试还没有彻底,所以我不自信地说VS2010中没有这种行为。

答案 10 :(得分:0)

对我造成类似症状的原因是: 我在解决方案中有几个项目。有.cpp文件被> 1个项目引用(并因此编译)。不幸的是,Visual Studio使用非常简单的命名创建.obj文件 - 它只是将“.cpp”替换为“.obj”。使用不同的命名创建包装器.cpp-s解决了这个问题。

答案 11 :(得分:0)

我有类似的东西。即使我确实有构建前后事件,但它们并没有引起问题。事实证明,我在参考链中有许多项目,其中包含标记为“始终复制”的内容文件,而不是“复制如果更新”,这意味着这些项目始终被视为“过时”。通过将所有这些更改为“copy if new”,对我的单元测试项目的更改不再强制重新编译所有其他项目。

答案 12 :(得分:0)

禁用“最小重建”(配置属性> C / C ++>代码生成)为我修复了它。编译器甚至留下了线索:

1> cl:命令行警告D9007:'/ Gm'需要'/ Zi或/ ZI';选项被忽略

虽然我必须指出,编译器并没有忽略它所说的选项。

答案 13 :(得分:0)

在我的情况下,我将系统数据时间更改为上一个日期,因此每次都会重建,因为文件的时间戳不同,一旦更改为当前时间,每次都不会重建。

答案 14 :(得分:0)

我们经常在这里:

  • 手动删除所有中间文件和输出文件。 vstudio中的clean选项有时是不够的。从一个新的开始做完整的构建。如果在完成构建之后vstudio仍然想要重新编译某些文件,那么它可能与下一个项目符号相关。
  • 如果在你的vcxproj中引用了一个不在磁盘上的头文件,那么该项目也会被重新编译。你可以通过MSDN博客上描述的一些隐藏功能来检查这一点,或者只是触摸(即点击它打开)项目爆炸中的所有头文件,看看是否在磁盘上不存在

答案 15 :(得分:0)

有同样的问题。解决方法: -delete输出文件夹(obj,exe,所有文件) -run cygwin -cd项目文件夹 -run" touch *",重置文件修改日期/时间 - 建立并享受固定的问题

答案 16 :(得分:0)

项目重建存在类似问题。 Visual Studio不会重新编译,但每次在F7命中时重新链接项目。

修复很简单。尝试在编辑器中打开包含在项目中的所有文件(从解决方案资源管理器中双击每个文件)并从解决方案中删除那些不存在的文件。