更改.cpp文件导致Visual Studio 2012重新编译不相关的文件

时间:2013-04-30 21:49:03

标签: c++ visual-studio visual-studio-2012 msbuild

好奇,如果有人知道如何解决这个问题;我有一个特定的.cpp文件,由于某种原因,每当我修改它(甚至只是添加一个空白字符)并构建项目时,都会导致重新编译其他无关的.cpp文件(其中10-20个)。

该文件在任何其他文件中都不是#include(我从不直接#include .cpp文件,只有.h)并且没有其他我能想到的依赖 - 在我看来,像Visual Studio一样误解依赖树,或者有一些与其构建过程相关的损坏的内部状态。我已经尝试删除.sdf,.suo,ipch /,。user和目标文件目录,但问题会在短时间后再次出现。

修改任何其他.cpp文件会导致仅按预期重新编译该文件。

我对MSBuild有点了解,但在.vxproj文件中没有看到任何明显的错误 - 有问题的.cpp文件只在ClCompile项目组中出现一次,并且其标题仅在ClInclude组中出现一次。

如果这会响起任何铃声,或者如果有人对我如何跟踪它并对其进行故障排除有任何提示,我们将不胜感激!

更新

我跑了msbuild /verbosity:Detailed但不幸的是,它解释为什么不相关的文件被编译的原因是不透明的:

Using "CL" task from assembly "Microsoft.Build.CppTasks.Common.v110, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
Task "CL"
Read Tracking Logs:
    Debug\cl.read.1.tlog
Output details (109 of them) were not logged for performance reasons.
{UnrelatedFile1.cpp} will be compiled as {PROBLEM_FILE.CPP} was modified at 4/30/2013 3:28:02 PM.
{UnrelatedFile2.cpp} will be compiled as {PROBLEM_FILE.CPP} was modified at 4/30/2013 3:28:02 PM.
(etc...)

如果这对任何人都有意义让我知道 - 似乎无法找到关于CL任务的内部工作原理的大量信息,或者为什么它会在这些不相关的CPP文件之间看到依赖关系。

2 个答案:

答案 0 :(得分:1)

这可能是因为:

  • 它是另一个翻译单位的一部分。
  • 其他项目引用文件。
  • 某些东西(可能是预构建事件)正在“触摸”文件,以便编译器认为它们已经发生了变化。

更新: *另一个原因是项目中“已添加”的文件不再存在于磁盘上。

要调试此问题,您需要打开msbuild的最高级输出:

http://blogs.msdn.com/b/msbuild/archive/2005/09/29/475157.aspx

http://msdn.microsoft.com/en-us/library/vstudio/ms164311.aspx

例如:

msbuild /verbosity:Detailed

然后msbuild会告诉你为什么要重建它们。

编辑:

要回答关于详细程度的编辑:详细输出,您可以使用/ SHOWINCLUDES开关检查其包含的文件:

http://msdn.microsoft.com/en-us/library/hdkef6tk(v=vs.80).aspx

我假设必须有一些导致重建的标头链?或者原因可能是冗长的地方:详细的日志。

答案 1 :(得分:0)

我还没有尝试过,但在类似的问题中找到了一个有趣的建议: VS2010 always thinks project is out of date but nothing has changed