3

Visual Studio 有时会因为一个小改动而决定重建我的整个大型项目。我将构建日志记录转到诊断以查看问题所在,这就是我所看到的:

< Bunch of spam >
Outputs for C:\<snip>\PRECOMPILEDHEADERS.CPP:
    C:\<snip>\PRECOMPILEDHEADERS.OBJ
All outputs are up-to-date.
Forcing rebuild of all source files due to a change in the command line

...然后它会重建我的预编译头文件,然后是其他所有内容。

当我在项目中更改单个 .cpp 或 .h 文件时会发生这种情况。我没有更改项目设置中的任何内容。同样的变化也不会一直发生。这是随机的。

关于这里发生了什么的任何想法?我在哪里可以获得更多信息?我尝试通过http://blogs.msdn.com/b/vsproject/archive/2009/07/21/enable-c-project-system-logging.aspx中的描述启用调试,但它没有提供更多信息. 我无法弄清楚“由于命令行更改而强制重建所有源文件”的来源。它不在任何工厂 MSBuild 文件中。

其他一些信息:它是一个 C++/CLI dll 项目,它链接了许多其他项目,包括 C#、本机 c++ 和其他 C++/CLI dll。我尝试从依赖项中删除所有 C# 项目,因为它们往往会导致问题,但这并没有改变它。我已经用谷歌搜索了那个特定的字符串,但我的情况与其他任何报告它的人都不匹配。(一个是使用 Intel C++,另一个是命令行中的 MSBuild 并更改大小写。我正在从 Visual Studio 本身中构建解决方案)。

编辑以解释我尝试过的常见修复:

我试过只构建项目。做同样的事情。

我不包括任何不存在的 .h 文件。

我已经删除了 bin/object 文件夹并从头开始重建。这通常会使它在几个构建中消失,但随后它又回来了。

编辑#2:

在前面的日志中发现了一些可疑的东西:

3>Using "ResolveNonMSBuildProjectOutput" task from assembly "Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
3>Task "ResolveNonMSBuildProjectOutput"
3>  Resolving project reference "..\..\..\..\CommonCore\VS2010\Project1\Project1.vcxproj".
3>  Project reference "..\..\..\..\CommonCore\VS2010\Project1\Project1.vcxproj" has not been resolved.

这在我的几个项目中重复......我将追查它,看看是否可能是项目参考提示路径的问题。

4

3 回答 3

3

好的,这是一个旧线程,但我最近遇到了同样的问题。我的解决方案是禁用预编译的头文件——现在对一个源文件的简单更改将不再导致“重建”。

于 2012-11-27T10:29:03.027 回答
2

我最近在使用 Visual Studio 2012 时遇到了同样的问题。我在 Windows 7 上使用 Visual Studio 2012 Professional (2012.2) 构建 C++ 项目。值得注意的是,我最近将解决方案从 Visual Studio 2008 迁移到了 Visual Studio 2012。

每次更改其中一个编译单元时,其中一个 C++ 项目(以 DLL 项目作为参考的可执行文件)都会重新构建,例如,简单地保存 main.cpp 将导致所有编译单元(包括预编译的头文件)重新构建。我在构建日志中发现了以下消息:

由于自上次构建以来命令行中的更改而强制重新构建所有源文件。

我将构建日志文件的详细程度设置为诊断工具 > 选项 > 项目和解决方案 > 构建和运行),并比较了干净构建和一个编译单元更改后的构建(强制完全重建)的日志文件。我注意到:

  • Path ”已从一个版本更改为下一个版本(“ ;C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\VsGraphics ”似乎已被添加到最后)
  • TaskTracker.exe命令行与CancelEvents存在差异
  • 有关于未设置OutputPath的警告

我把头发拉了出来。

我最终求助于从头开始重新创建有问题的项目,而不是依赖于 2008 年到 2012 年迁移过程中自动生成的项目。它现在的行为似乎符合预期。

于 2013-04-12T02:10:07.820 回答
1

我做了三件事,问题似乎已经消失了。我正在尝试缩小范围,但我想我会继续发布它们:

  • 删除并重新添加了所有引用和项目引用
  • 修复了我的一个项目,它没有将 .NET 框架目标设置为 3.5 以匹配我的解决方案的其余部分(我侥幸逃脱,因为该项目无论如何都没有使用 .NET)
  • 将所有引用(包括系统引用)的“复制本地附属程序集”设置为 false。

当心这些东西的一部分或全部可能是巫毒……

于 2011-09-26T21:34:21.283 回答