39

我已将解决方案从 VS2008 迁移到 VS2010 (SP1)。
现在,我的一个项目永远无法在最新状态中找到平静。每个构建都有以下输出:

1>------ Build started: Project: PROJ_NAME, Configuration: Release Win32 ------
1>Build started 19/05/2011 7:59:27 AM.
1>InitializeBuildStatus:
1>  Creating "Release\PROJ_NAME.unsuccessfulbuild" because "AlwaysCreate" was specified.
1>ClCompile:
1>  All outputs are up-to-date.
1>  All outputs are up-to-date.
1>Lib:
1>  All outputs are up-to-date.
1>  PROJ_NAME.vcxproj -> C:\projFolder.PROJ_NAME.lib
1>FinalizeBuildStatus:
1>  Deleting file "Release\PROJ_NAME.unsuccessfulbuild".
1>  Touching "Release\PROJ_NAME.lastbuildstate".
1>
1>Build succeeded.
1>
1>Time Elapsed 00:00:00.09
========== Build: 1 succeeded, 0 failed, 5 up-to-date, 0 skipped ==========

有任何想法吗?

4

10 回答 10

45

当项目中列出的包含文件之一实际上不存在时,我遇到了类似的问题。我已删除该文件,但忘记将其从项目中删除。

然后依赖检查器认为该项目不是最新的,但构建器没有发现要构建的东西。

于 2011-05-19T05:21:12.640 回答
36

我有两个项目包含相同的文件。当第二个项目构建时,它再次编译文件,更改“触摸”日期时间。这反过来为第一个项目设置了“AlwaysCreate”标志。

我通过在“C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe.config”文件中打开“CPS”发现了这一点,如下面的 xml 片段所示。激活后,您可以使用 DebugView 工具从 VS2010 获取消息,说明它为什么要重建您的项目。为什么这些消息不进入构建日志是我无法理解的,但无论如何它是存在的。

添加这个:

<system.diagnostics>
  <switches>
    <add name="CPS" value="4" />
  </switches>
</system.diagnostics>

到这里:

<?xml version ="1.0"?>
<configuration>
    <configSections>
        <section name="msbuildToolsets" type="Microsoft.Build.BuildEngine.ToolsetConfigurationSection, Microsoft.Build.Engine, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </configSections>
    <system.diagnostics>
      <switches>
        <add name="CPS" value="4" />
      </switches>
    </system.diagnostics>
    <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0.30319" />
于 2011-11-10T18:46:58.827 回答
8

根据MSDN上的这个线程:

在我的 VS10 中,这是由于项目文件夹中缺少(但未编译的 .h 文件,因此没有额外的错误可识别)。

快速检查所有项目文件都可以在编辑器中打开解决了这个问题。

于 2011-05-19T05:20:36.373 回答
2

您还必须检查 .h 以外的其他文件。在我的项目中,Readme.txt 被遗漏了。

于 2013-03-20T18:47:08.360 回答
2

我将一个解决方案移动到一个新文件夹,每次我构建一个新版本或尝试调试时,它都会声称构成该解决方案的所有项目都已过时,即使它刚刚构建它们。

我搜索了所有 .vcxproj 文件,使用了 CPS=4 的 DebugView(请参阅上面的@Bzzt 答案),发现它正在它们的旧位置寻找头文件。由于解决方案是移动的,而不是复制的,因此这些文件不存在。

最终为我解决的问题是清理解决方案并进行重建。之后,“AlwaysCreate”不再导致它“构建”所有子项目。您必须分别清理每个配置(调试和发布),但是一旦从清理状态重建,一切都很好。

就我而言,它实际上并没有进行任何构建,但是 MSBuild 或任何已过时的决定,正在使用一些不再存在的缓存文件路径。Clean and Rebuild 替换了该缓存,然后按预期构建

于 2013-05-31T18:51:11.070 回答
0

我遇到了同样的问题。

根本原因:VS 的构建版本不正确(32 位和 64 位)

解决方案:切换模式 Debug/Release 从 32 位到 64 位或反向

http://postimg.org/image/3jurey1qr/

于 2013-07-03T17:09:47.227 回答
0

在 Visual Studio 2010 中,我通过取消设置多处理器编译 (/MP) 来消除多项目解决方案的虚假重建(可惜!)。以前,我启用了它。在此处找到标志:Common Properties > C/C++ > General > Multi-processor Compilation。此外,我注意到我能够通过单独重建每个项目来消除单个项目的虚假重建。然后每个的构建显示每个都是最新的。

于 2014-03-05T16:39:05.963 回答
0

为了让它工作,我只是重命名了我现有的输出目录,以便重新创建所有中间文件(在尝试所有上述接受的答案之后)。

过去我曾在 VS2010 中使用 DebugView 来查找要删除的文件,但今天这种方法不起作用。在我的任何代码或项目文件 XML 中,我找不到对使用 DebugView 找到的丢失头文件的任何引用。我还从 TFS 中检索了过时的文件,以尝试在我的机器上存在和不存在它们。

然后我使用 GREP 搜索我的整个解决方案目录,唯一的结果是二进制文件:旧代码文件的 *.obj、项目文件的 *.pdb 和 vc100.idb。我不知道这些文件在构建和重建过程中是如何被修改/替换的,所以我不确定其中一个文件中的先前引用是否负责声称旧的头文件丢失。

希望这对未来的人有所帮助,并感谢上述让我开始的信息!

于 2015-09-03T21:51:09.137 回答
0

对于命令行 msbuild.exe 构建,您可以使用 /verbosity:detailed 并搜索输出

  • “将被编译为”以查找编译
  • “需要源代码编译”来查找链接

注意:可以使用msbuild.exe /verbosity:detailed > output.txt将输出通过管道传输到文件

例如

code.cpp will be compiled as C:\path\to\header.h was modified at 18/02/2016 15:58:31.
Outputs for C:\path\to\code.cpp:
于 2016-02-19T10:58:24.747 回答
0

您可能还会发现在 Windows 更新后会发生这种情况,请参阅以下内容:由于 TZRE.DLL 再次编译的最新项目 日期戳是在 Windows 更新后的未来

解决办法是等到那个时候,问题就会神奇地消失。我刚遇到同样的问题,我的 TZRES.DLL 文件是 17/07/2018 19:54,现在时间是 17/07/2018 15:15

于 2018-07-17T14:18:17.330 回答