【问题标题】:Solving the Visual Studio 2010 AlwaysCreate rebuild issue解决 Visual Studio 2010 AlwaysCreate 重建问题
【发布时间】:2011-05-10 07:06:02
【问题描述】:

我有一个 C++ 项目,我目前正在从 VS2008 移植到 VS2010。当我构建项目时,Visual Studio 2010 报告构建成功,但如果我随后按 F5 启动调试器,我会被告知项目不是最新的。如果我忽略这个警告,我可以继续调试,但如果我按下 ok,整个项目(数百个源文件)将从头开始重建。输出包含以下内容;

1>------ Build started: Project: SCCW-VC2010, Configuration: Debug Win32 ------
1>Build started 15/11/2010 14:47:40.
1>InitializeBuildStatus:
1>  Creating "Debug\SCCW-VC2010.unsuccessfulbuild" because "AlwaysCreate" was specified.
1>Midl:
1>  All outputs are up-to-date.
1>ClCompile:
1>  tinedit.cpp
1>  _WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h)
1>  Automatically linking with sfl504d.lib
1>  Automatically linking with ot1104d.lib
1>c:\program files\rogue wave\stingray studio 10.4\include\toolkit\sectndlg.h(134): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>          c:\program files\microsoft visual studio 10.0\vc\include\string.h(105) : see declaration of 'strcpy'
1>  Automatically linking with og1204d.lib
1>  Automatically linking with RWUXThemeD10.lib
1>  profile.cpp
1>  ZOffsetDialog.cpp

半小时后,一旦构建完成,调试器就会启动。我的猜测是消息

正在创建“Debug\SCCW-VC2010.unsuccessfulbuild”,因为指定了“AlwaysCreate”。

是问题的一部分,但我无法将其与项目设置联系起来。我找到了some help on google,但到目前为止没有任何效果。有其他人遇到过这个问题并且知道解决方法吗?

编辑:根据 Jalf 在下面 cmets 中的建议,我创建了一个新的投影,将我所有的文件导入到该项目中,并且新项目也存在同样的问题。具体来说,我复制了以下所有组;

<ClCompile Include="..\MyDir\MyFile.cpp"/>
<ClInclude Include="..\MyDir\MyFile.h" />
<None Include="res\MyFile.ico" />  (and all similar resources)
<Library Include="..\MyDir\MyFile.lib" />

Edit2: 在浏览了所有包含的标题后,我最终找到了 3 个不存在的标题。删除它们并在原始项目上进行全部重建似乎已经解决了这个问题。一些提到此问题的博客文章将其称为错误,两天后的浪费时间,我倾向于同意。感谢您提供的答案和 cmets。

Edit3: 一天后问题又回来了!对项目中的任何文件进行任何编辑都会再次导致完全重建。根据 John Dibling 的回答,该项目确实包含一些静态库,包括 Stingray。我正在放弃 VS2010 并回到 VS2008,因为我有最后期限。相关信息见以下链接;

Visual Studio 2010 always thinks project is out of date, but nothing has changed

http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/38c08137-3bb0-4143-b97f-72d077646318

Link

最终编辑 VS2010 SP1 的发布解决了这个问题,现在构建快速高效。

【问题讨论】:

  • 是否可以简单地重新创建解决方案 + 项目?
  • @jalf,这是一个选项,但在 IDE 中执行此操作很耗时,因为不同位置有很多文件。我可以通过制作一个空白的 vxcproj 并剪切和粘贴我的文件来破解它,但很可能最终把问题交给我。
  • 如果你这样做了,我认为你不会有问题。将项目从一个版本的 VS 升级到另一个版本总是会导致它设置各种通常不需要的奇怪设置(有时,如您的情况,甚至会引入错误)。如果您可以创建一个空白项目然后重新添加所有文件,我怀疑它会正常工作。
  • @jalf,根据我上面的编辑创建了一个新项目并导入了所有文件,但没有任何改进。不过值得一试。而且新项目比导入的版本小很多,编译速度也快了一些。
  • 很遗憾它没有修复它。但很高兴听到至少有一些改进。确实,每次版本升级都会使项目变得非常混乱。我以前也注意到过类似的差异。

标签: c++ visual-studio-2010 build


【解决方案1】:
  1. 在输出窗口中查看正在重建的文件

  2. 转到菜单Tools->Options,然后导航到Project and Solutions->Build and Run。将选项 MSBuild Project build output verbosity 更改为:

    Diagnostic
    
  3. 构建,得到长日志

  4. 在日志中查找文件(从 1 开始),读取诊断信息。 例如,您可能会找到具有未来日期或不存在日期的标题名称。

【讨论】:

  • 这是最好的建议,是快速找出问题原因的通用解决方案。只需设置诊断并构建您认为不必要地构建的第一个项目,BINGO - 诊断的第一行告诉我。我有两个项目,其中包含已删除的文件,还有一个项目在文件上设置了 AlwaysCopy 属性。
  • @GilesDMiddleton 我正在使用 Visual Studio 2015,诊断文件的第一行并没有告诉我任何有用的信息。我实际上无法在诊断文件中找到触发重建的原因(它有数千行,我无法阅读所有内容)。我应该搜索哪些字符串?我尝试了诸如“重建”之类的常识,但没有任何用处。
  • “你可能发现了一个有未来日期的标题”你来自未来吗?节省了很多时间!
【解决方案2】:

我已经多次遇到这个问题,而且总是令人沮丧。我会告诉你我的问题是什么,但首先我要问你:

  • 您是在第一次尝试运行之前进行了全部重建,还是只进行了重建?
  • 全部重建后,如果您未进行任何更改,它是否会再次要求您重建?

我的问题有点复杂。我有自定义构建规则,将 Stingray 的二进制文件从其源目录(它们所在的位置)复制到我的构建树中的目录。二进制文件被标记为依赖项,以便在每次构建之前复制它们以防它们发生变化。

检查的依赖关系查看了这些文件的时间戳,以了解它们何时被更改。如果blah.lib 在其源目录中有一个去年 12 月的修改日期,那么当它被复制时,它将具有相同的修改日期。检查的依赖关系会注意到“嘿,这个文件很旧,我们必须重建它”,然后它会询问我是否要进行完全重建。

有一段时间我只是说“不”,但最终我通过更改自定义构建规则来解决问题,在它完成文件复制后写入一个新的文本文件。这将使新的文本文件成为依赖项,而不是 blah.lib 文件,这让编译器很高兴。

【讨论】:

【解决方案3】:

我在转换和从头开始的项目中都遇到了同样的问题。我从 MS 页面得到了关于丢失文件的提示。我检查了我的项目,发现它引用了一个不存在的文件。用正确的文件替换它,问题就消失了。

【讨论】:

  • FWIW,当我们的构建环境升级到 VS 2012 时,我遇到了一系列非常棘手的问题——很多情况下发生的事情并不明显。我按照此处的说明 - blogs.msdn.com/b/andrewarnottms/archive/2012/06/07/… 以及该文章顶部提到的链接使用 Visual Studio 的第二个实例在第一个实例中调试构建过程。像魅力一样工作。
【解决方案4】:

我知道这是一个非常非常古老的帖子,但为了所有仍然有这个问题的人的利益,我决定发布我的意见。 因为指定的“AlwaysCreate”与正在重建的项目无关。

IT 正好相反。 如果您或 Visual Studio 决定全部重建,则会创建“*.unsuccessfulbuild”文件。

由于指定了“AlwaysCreate”,其他一些问题(通常是不存在的标头)将导致重建所有导致显示。

“AlwaysCreate”是 Visual Studio 构建环境设置的一部分,也是 Microsoft.CppBuild.targets XML 文件的一部分。 它包含以下行: Touch AlwaysCreate="true" Files="$(LastBuildUnsuccessful)"/

如果设置为 true,则无论构建是否成功,都会始终创建“.unsuccessfulbuild”文件。如果将其更改为 false,则不会创建 ".unsuccessfulbuild。 如果为 true,则 *.unsuccessfulbuild 文件在构建过程中创建为空,如果构建成功则删除。 我不确定为什么要创建这个文件;即使构建有错误,文件也是空的,但不会像构建成功的情况那样被删除。

可能这个文件的存在有一些只有VS构建环境才知道的含义。 如果您想使用此设置,请从

【讨论】:

  • 我相信创建这个文件是因为构建过程中可能存在一些仅通过源/目标文件时间戳无法检测到的故障。例如,可能存在运行但未产生可辨别的目标文件的前/后事件。如果它们失败,构建停止,或者构建神秘地崩溃,.unsuccessful 构建文件将在下一次出现,并且构建系统知道再试一次。
【解决方案5】:

MSDN docs 暗示此属性特定于部署项目。

findstr /si AlwaysCreate 在你的 VS2010 项目文件上应该会告诉你罪魁祸首,如果你不能在 GUI 中找到它。

【讨论】:

  • 网址已过期,我想正确的命令是findstr /si AlwatsCreate *.vcxproj ...无论如何,在我的情况下,这未能找到问题的根源。
  • 更新了 VS2010 特定表单的 URL,因为它已从 VS2012 消失
  • 这并没有解决我在 vs2012 中遇到的相同问题,请参阅我的案例stackoverflow.com/questions/17900716/…
【解决方案6】:

决定使用 SP1 的发行版重新审视这一点。我从头开始重新创建了一个新项目,与升级后的 1.4mb 旧项目相比,它的成本为 81k,其中包含各种垃圾。最初,我遇到了同样的问题,但设法解决如下;

  • 将预编译的标头更改为 Create (/Yc)
  • 编译了一个源文件
  • 将预编译的标头更改为使用 (/Yu)
  • 进行了全面重建

我注意到的下一个问题是,任何资源添加都会导致重新编译包含 resource.h 的所有文件。使用以下 Microsoft connect thread 的建议并手动将以下行添加到我的项目中已修复此问题;

<ItemGroup>
    <ClNoDependencies Include="Resource.h" />
</ItemGroup>

【讨论】:

    【解决方案7】:

    就我而言,它似乎有助于构建部署项目。当我点击 F7 时,我将它们设置为不构建,而是手动构建。有些人建议创建一个新的解决方案 + 项目,但当项目有很多手动调整和自定义构建规则时,这不是一个很好的选择。

    【讨论】:

    • 似乎更像是评论而不是答案。
    【解决方案8】:

    链接在此处的其中一个cmets中,但很容易错过,所以我从这个链接重新发布了这里的基本步骤:MSDN Article

    其实这个链接是我自己找到的,后来才发现这里已经提到了。

    1. Since it can be difficult to recover from a damaged devenv.exe.config file, consider copying the file to devenv.exe.config.original before modifying it so you have a backup copy you can revert to if things go awry.
    2. Open your VisualStudioInstallFolder\Common7\IDE\devenv.exe.config file.  Note this will be in %ProgramFiles(x86)% on 64-bit Windows.
    3. Open a text editor with admin privileges.
    4. Add this snippet to your devenv.exe.config file just below the <configSections /> block:
        For Visual Studio 2012 and below...
        <system.diagnostics>
        <switches><add name="CPS" value="4" /></switches>
        </system.diagnostics>
        For Visual Studio 2013
        <system.diagnostics>
        <switches><add name="CPS" value="Verbose" /></switches>
        </system.diagnostics>
    5. Save the text file.
    

    我使用 Visual Studio 2010 + SP1,两个 XML sn-ps 似乎都可以工作。

    现在你需要一个可以像DebugView一样显示窗口DebugOutput的工具。

    1. Start DebugView 
    2. Rebuild
    3. Build
    4. In DebugView window search for the string ‘missing’ or 'not up to date', better still to save the DebugView log entries and open it in notepad and then search.
    

    【讨论】:

      【解决方案9】:

      如果持续重建没有“合法”原因(例如,引用丢失的头文件),请尝试删除解决方案的 .sdf 文件(当然,当解决方案关闭时)并重建。这对我有用。

      【讨论】:

        【解决方案10】:

        解决方案修改 devenv.exe.config + 使用 DebugView 对我有用(vs2010)。

        DebugView 为您列出丢失的文件。

        【讨论】:

          【解决方案11】:

          如果文件日期异常,就会发生这种情况。 VS 编译器必须重新编译所有具有未来日期的文件。 -- 示例 --

          Current date : June 30, 2015
          File date : July 1, 2015
          The file is always compiled during today.
          

          AlwaysCreate指令无关。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-10-29
            • 1970-01-01
            • 2016-10-17
            • 2019-05-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多