VS2010因修改了无关文件而重新构建C++项目

8
作为我们都已经知道的,VS2010已经对其构建系统进行了重大升级,该系统基于MSBuild。
根据微软代表的说法(请参见Visual Studio 2010 always rebuild project after hibernation/restart of computer中的评论),MSBuild现在将自己注入到其他工具(如C++编译器、链接器等)中,以查找目标的依赖关系。
这种方法的一个缺点是,现在你的项目可能会因为不相关文件的修改而被强制重新构建:(
在我的情况下,这是由NVIDIA更新服务(Windows 7 32位)定期更改的C:\PROGRAMDATA\NVIDIA CORPORATION\DRS\NVDRSDB0.BIN

我发现通过将VS2010选项"MSBuild项目生成输出详细信息"和"MSBuild项目生成日志文件详细信息"设置为"诊断",可以看到问题的原因在生成输出窗口中:

Task "CL" (TaskId:55)
  Read Tracking Logs: (TaskId:55)
    ..\..\temp\Release\Editor\cl.read.1.tlog (TaskId:55)
  Outputs for E:\USERS\A.USER.ORG\DEVEL\EDITOR\STDAFX.CPP: (TaskId:55)
E:\USERS\A.USER.ORG\DEVEL\TEMP\RELEASE\EDITOR\STDAFX.OBJ (TaskId:55)
  C:\PROGRAMDATA\NVIDIA CORPORATION\DRS\NVDRSDB0.BIN was modified at 23-Feb-12 12:08:20. (TaskId:55)
 stdafx.cpp will be compiled. (TaskId:55)
...
 Tracking command: (TaskId:55)
 C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\NETFX 4.0 Tools\Tracker.exe ... stdafx.cpp /clr:nostdlib  (TaskId:55)
 stdafx.cpp (TaskId:55)
Done executing task "CL". (TaskId:55)

一个解决方法是将无关文件添加到C++忽略列表中:
<ItemGroup>
  <ClNoDependencies Include="NVDRSDB0.BIN" />
  <ClNoDependencies Include="C:\PROGRAMDATA\NVIDIA CORPORATION\DRS\NVDRSDB0.BIN" />
</ItemGroup>

很遗憾,这并没有帮助 :( 我还没有检查这个技巧在其他PC上的工作原理,那里没有这样的文件。

因此问题仍然存在:有人知道解决这个问题的方法吗

我没有尝试安装VS2010的SP1-根据爱好者的说法,这一步也没有帮助。
禁用NVIDIA更新服务可能会有所帮助(它将停止更新文件),但可能有其他软件无法通过这种方式禁用(防病毒软件,其他实用程序等)。
另请参见相关问题:

3个回答

1

我也遇到了同样的问题,只不过在我的情况下,“修改”的文件是

C:\PROGRAMDATA\SOPHOS\SOPHOS ANTI-VIRUS\CONFIG\CONFIG.BOPS

微软已经承认存在一个漏洞(将在下一个版本中修复),并提出了解决方法。

http://connect.microsoft.com/VisualStudio/feedback/details/715572/unexpected-rebuild-of-projects

http://connect.microsoft.com/VisualStudio/feedback/details/649139/vs2010-does-complete-rebuild-based-on-completely-unrelated-file

但是迄今为止,这些都没有对我起作用。我仍在尝试调整我的

C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Platforms\Win32\Microsoft.Cpp.Win32.targets

将文件添加到我的属性表中,类似于以下内容

<ItemGroup>
  <ClNoDependencies Include="C:\PROGRAMDATA\SOPHOS\SOPHOS ANTI-VIRUS\CONFIG\CONFIG.BOPS"/>
</ItemGroup>

但是到目前为止,我还没有成功。也许你可以尝试这个解决方法?(如果有效,请告诉我!)


感谢分享这些信息。我好像在微软论坛上看到过类似的内容。无论如何,使用ClNoDependencies的方法在VS2010中不起作用...而且提到的下一个版本可能是即将推出的VS2012。我希望问题最终能够得到解决 :) - AntonK
我实际上已经让这个解决方法起作用了...大部分。诀窍是在每个阶段(编译、链接、资源、嵌入清单)中添加“无依赖项”的定义(我可能忘记了其中一个)。我已经完成了前几个步骤,并看到我的“额外”重建只执行了资源和嵌入清单步骤。所以...我差不多成功了,然后我的IT部门让我们通过回滚到Sophos反病毒应用程序的先前版本来解决问题,所以整个问题都消失了。 - aldo
1
更新:Sophos在后续版本中实施了修复,解决了这个问题。我使用当前版本的Sophos和Visual Studio 2010时不再遇到此问题。 - aldo

0

我通过将 C:\PROGRAMDATA\NVIDIA CORPORATION\DRS\ 添加到我的用户属性表 VC++ Directories/Exclude Directories 中,成功解决了这个问题。

要编辑此文件,请打开查看->属性管理器,它将在每个项目/配置下。

如果您不想在整个系统中执行此操作,可以创建一个新的属性表,并仅将其添加到需要设置的项目中。您可以在属性管理器中多选所有需要设置的项目,然后右键单击->添加新属性表。


0
我们在Sophos的CONFIG.BOPS文件上遇到了同样的问题。我们有一个庞大的团队,我们的解决方案有80多个项目,所以其他人描述的解决方法对我们来说不太吸引人。我采取了一种非常好用的方法。有些人可能会说这是一个完全的黑客行为,我承认它确实是,但它非常简单,并且在微软修复此问题之前它可以使用。
我用C#编写了一个小型桌面托盘应用程序来监视CONFIG.BOPS文件,每当时间戳更改时,它就使用File.SetLastWriteTime将其设置回旧日期,而不修改文件内容。该应用程序必须在Windows 7上以管理员身份运行,但对我们来说这没问题,因为我们的员工都有PC的管理员权限。我们没有NVDRSDB0.BIN问题,但我认为它也可以适用于那种情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接