Visual Studio 2010始终认为项目已过时,但一切都没有改变

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

我有一个和这里描述的非常相似的问题。

我还从VisualNo.Studio和Nbsp 2008升级到VisualNasnStudio & Nbsp 2010的C++/CLI和C~*项目的混合解决方案。现在在VisualN& Studio & Nbsp 2010中,一个C++/CLI项目总是过时。

即使它之前已经编译并链接,并且点击了f5,消息框"项目已过期"。你想建造它吗?"出现。这是非常恼人的,因为dll文件的层次非常低,并且强制解决方案的几乎所有项目重新生成。

我的PDB设置被设置为默认值(此问题的建议解决方案)。

是否有可能获得Visual Studio 2010强制重新生成或认为项目是最新的原因?

对于Visual Studio 2010为何如此表现,还有其他想法吗?


仅适用于Visual Studio/Express 2010。查看VS2012、VS2013等的其他(更简单)答案

要找到丢失的文件,请使用文章中的信息使C++项目系统日志记录能够在VisualStudio中启用调试日志,并让它告诉您什么导致了重建:

  • 打开devenv.exe.config文件(在%ProgramFiles%\Microsoft Visual Studio 10.0\Common7\IDE\%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\Common7\IDE\中找到)。对于Express版本,配置文件命名为V*Express.exe.config
  • 行后添加以下内容:

    1
    2
    3
    4
    5
    <system.diagnostics>
      <switches>
       
      </switches>
    </system.diagnostics>
  • 重新启动Visual Studio
  • 打开dbgview并确保它正在捕获调试输出
  • 尝试调试(在Visual Studio中按F5键)
  • 在调试日志中搜索表单的任何行:


    devenv.exe Information: 0 : Project 'Bla\Bla\Dummy.vcxproj' not up to date because build input 'Bla\Bla\SomeFile.h' is missing.

    (我刚刚按了ctrl+f并搜索了not up to date)这些引用将导致项目永久"过时"。

  • 若要更正此问题,请从项目中删除对丢失文件的任何引用,或更新引用以指示其实际位置。

    注意:如果使用2012或更高版本,则代码段应为:

    1
    2
    3
    4
    5
    <system.diagnostics>
      <switches>
       
      </switches>
    </system.diagnostics>


    在Visual Studio 2012中,我能够比公认的解决方案更轻松地获得相同的结果。

    我在菜单工具→选项→项目和解决方案→构建和运行→*msbuild project build output verbosity"中将选项从最小更改为诊断。

    然后在构建输出中,我通过搜索"不是最新的"找到了相同的行:

    Project 'blabla' is not up to date. Project item 'c:\foo\bar.xml' has 'Copy to Output Directory' attribute set to 'Copy always'.


    这件事今天发生在我身上。我找到了原因:这个项目包含了一个不再存在于磁盘上的头文件。

    从项目中删除文件解决了问题。


    我们也遇到了这个问题,并发现了如何解决它。

    问题如上所述:"文件不再存在于磁盘上。"

    这不太正确。文件确实存在于磁盘上,但.vcproj文件正在其他地方引用该文件。

    通过转到"包含文件视图"并依次单击每个包含文件,直到找到Visual Studio找不到的文件,可以"发现"此问题。然后添加该文件(作为现有项)并删除找不到的引用,一切正常。

    一个有效的问题是:如果Visual Studio不知道include文件在哪里,它如何构建?

    我们认为.vcproj文件在某个地方有一些相对路径指向有问题的文件,而该文件在Visual Studio GUI中没有显示,这说明了即使includes的树视图不正确,项目实际生成的原因。


    这个公认的答案帮助我走上了正确的道路,找到了如何解决这个问题的方法,因为这个失败的项目是我必须开始工作的。但是,我不得不处理大量坏的include头。对于详细的调试输出,删除一个会导致IDE在输出debug spew时冻结30秒,这使得进程运行非常缓慢。

    我不耐烦,写了一个快速而脏的python脚本来检查(Visual Studio 2010)项目文件,并立即输出所有丢失的文件以及它们所在的过滤器。你可以在这里找到它作为一个gist:https://gist.github.com/antiuniverse/3825678(或者这个fork支持相对路径)

    例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    D:\...> check_inc.py sdk/src/game/client/swarm_sdk_client.vcxproj
    [Header Files]:
      fx_cs_blood.h   (cstrike\fx_cs_blood.h)
      hud_radar.h   (cstrike\hud_radar.h)
    [Game Shared Header Files]:
      basecsgrenade_projectile.h   (..\shared\cstrike\basecsgrenade_projectile.h)
      fx_cs_shared.h   (..\shared\cstrike\fx_cs_shared.h)
      weapon_flashbang.h   (..\shared\cstrike\weapon_flashbang.h)
      weapon_hegrenade.h   (..\shared\cstrike\weapon_hegrenade.h)
      weapon_ifmsteadycam.h   (..\shared\weapon_ifmsteadycam.h)
    [Source Files\Swarm\GameUI - Embedded\Base GameUI\Headers]:
      basepaenl.h   (swarm\gameui\basepaenl.h)
      ...

    源代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #!/c/Python32/python.exe
    import sys
    import os
    import os.path
    import xml.etree.ElementTree as ET

    ns = '{http://schemas.microsoft.com/developer/msbuild/2003}'

    #Works with relative path also
    projectFileName = sys.argv[1]

    if not os.path.isabs(projectFileName):
       projectFileName = os.path.join(os.getcwd(), projectFileName)

    filterTree = ET.parse(projectFileName+".filters")
    filterRoot = filterTree.getroot()
    filterDict = dict()
    missingDict = dict()

    for inc in filterRoot.iter(ns+'ClInclude'):
        incFileRel = inc.get('Include')
        incFilter = inc.find(ns+'Filter')
        if incFileRel != None and incFilter != None:
            filterDict[incFileRel] = incFilter.text
            if incFilter.text not in missingDict:
                missingDict[incFilter.text] = []

    projTree = ET.parse(projectFileName)
    projRoot = projTree.getroot()

    for inc in projRoot.iter(ns+'ClInclude'):
        incFileRel = inc.get('Include')
        if incFileRel != None:
            incFile = os.path.abspath(os.path.join(os.path.dirname(projectFileName), incFileRel))
            if not os.path.exists(incFile):
                missingDict[filterDict[incFileRel]].append(incFileRel)

    for (missingGroup, missingList) in missingDict.items():
        if len(missingList) > 0:
            print("["+missingGroup+"]:")
            for missing in missingList:
                print(" " + os.path.basename(missing) +"   (" + missing +")")


    我已经从解决方案(和磁盘)中删除了一个cpp和一些头文件,但仍然有问题。

    问题是,编译器使用的每个文件都位于temp目录中的一个*.tlog文件中。删除文件时,不会更新此*.tlog文件。这是增量构建用来检查项目是否是最新的文件。

    请手动编辑此.tlog文件,或者清理项目并重新生成。


    我有一个类似的问题,但是在我的例子中没有丢失任何文件,在如何定义PDB输出文件的过程中出现了一个错误:我忘记了后缀.pdb(我用调试日志技巧发现了)。

    为了解决我更改的问题,在vxproj文件中,以下行:

    1
    <ProgramDataBaseFileName>MyName</ProgramDataBaseFileName>

    1
    <ProgramDataBaseFileName>MyName.pdb</ProgramDataBaseFileName>

    我在VS2013(更新5)中遇到了这个问题,有两个原因,您可以通过启用"工具"->"项目和解决方案"->"构建和运行"下的"详细"构建输出找到这两个原因。

  • "Forcing recompile of all source files due to missing PDB"..."当禁用编译器选项中的调试信息输出(在"项目设置"下)时,会发生这种情况。C/C++"->"调试信息格式"到"?没有"?"链接器"->"生成调试信息"到?没有":"。如果你走了?C/C++ +"->"程序数据库文件名"默认"(这是什么?)$(intdir)vc$(platformtoolsetversion).pdb"),VS由于错误而找不到该文件(https://connect.microsoft.com/VisualStudio/Feedback/Details/833494/Project with Debug Information Disabled Always Rebuilds)。要修复它,只需将文件名清除为"(空字段)。

  • "Forcing rebuild of all source files due to a change in the command line since the last build."这似乎也是一个已知的vs bug(https://connect.microsoft.com/VisualStudio/Feedback/details/833943/forcing-rebuild-of-all-source-files-due-to-a-change-in-the-command-line-since-the-last-build),并且似乎在较新版本(而非VS2013)中得到了修复。我不知道有什么解决办法,但如果你知道,无论如何,把它贴在这里。


  • Visual Studio论坛引用的另一个简单解决方案。

    更改配置:菜单工具→选项→项目和解决方案→VC++项目设置→解决方案资源管理器模式以显示所有文件。

    然后您可以在解决方案资源管理器中查看所有文件。

    找到标有黄色图标的文件,并将其从项目中删除。

    没关系。


    我不知道其他人是否也有同样的问题,但是我的项目的属性将"Configuration Properties" -> C/C++ ->"Debug Information Format"设置为"无",当我将它切换回默认的"程序数据库(/zi)"时,它会阻止项目每次重新编译。


    Visual Studio 2013--"由于缺少PDB而强制重新编译所有源文件"。我打开详细的构建输出来定位问题:我在"工具"→"项目和解决方案"→"构建和运行"下启用了"详细的"构建输出。

    我有几个项目,所有C++,我为项目设置设置选项:(C/C+++调试信息格式),用于项目项目的数据库(/ZI)。然而,这并没有阻止该项目的问题。问题来自解决方案中的其他C++项目之一。

    我将所有C++项目设置为"程序数据库(/ZI)"。这解决了问题。

    同样,报告问题的项目不是问题项目。尝试将所有项目设置为"程序数据库(/zi)"以解决此问题。


    我也遇到了类似的问题,按照上面的说明(接受的答案)找到丢失的文件,但没有抓伤我的头。这是我做的总结。准确地说,这些文件不会丢失,因为项目不需要它们来构建(至少在我的例子中),但它们是对磁盘上不存在的文件的引用,而这些文件实际上并不需要。

    这是我的故事:

  • 在Windows 7下,该文件位于%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\Common7\IDE\%。有两个类似的文件devenv.exe.config.configdevenv.exe.config。你想以后换一个。

  • 在Windows 7下,您没有权限在程序文件中编辑此文件。只需将它复制到其他地方(桌面)更改它,然后将其复制回程序文件位置。

  • 我想知道如何将debugview连接到IDE以查看丢失的文件。好吧,你什么都不用做。运行它,它将捕获所有消息。确保在Capture菜单中选择Capture Events菜单选项,默认情况下应选择该选项。

  • debugview不会一次显示所有丢失的文件(至少对我来说不是这样)!您将运行debugview,而不是在Visual Studio 2010中运行该项目。它将提示project out of date消息,选择是进行构建,debugview将显示丢失或导致重建的第一个文件。在记事本中打开项目文件(不是解决方案文件),然后搜索该文件并将其删除。在执行此删除操作时,最好关闭项目并重新打开它。重复此过程,直到DebugView不再显示任何丢失的文件。

  • 通过debugview工具栏按钮或编辑→过滤/突出显示选项将消息过滤器设置为非最新状态是很有帮助的。这样,它显示的唯一消息就是其中包含"非最新"字符串的消息。

  • 我有很多不必要的参考文件,删除它们都可以按照上述步骤解决这个问题。

    第二种同时查找所有丢失文件的方法

    有第二种方法可以同时查找所有这些文件,但它涉及(a)源代码管理和(b)将其与Visual Studio 2010集成。使用Visual Studio 2010,将项目添加到源代码管理中所需的位置或虚拟位置。它将尝试添加所有文件,包括磁盘上不存在但在项目文件中引用的文件。转到源代码管理软件,比如performce,它应该以不同的颜色方案标记磁盘上不存在的这些文件。表演给他们看一把黑色的锁。这些是你丢失的参考资料。现在你有了一个所有这些的列表,你可以使用记事本从你的项目文件中删除它们,你的项目也不会抱怨过期。


    我今天遇到了这个问题,不过有点不一样。我的解决方案中有一个CUDA DLL项目。在一个干净的解决方案中编译是可以的,但否则它失败了,编译器总是认为CUDA DLL项目不是最新的。

    我从这篇文章中尝试了解决方法。

    但在我的解决方案中没有丢失的头文件。然后我发现了我此案的原因。

    我以前更改过这个项目的中间目录,尽管它没有引起麻烦。现在,当我将CUDADLL项目的中间目录改回$(configuration)时,一切都恢复正常。

    我想CUDA构建自定义和非默认中间目录之间存在一些小问题。


    我正在使用带有更新4的Visual Studio 2013专业版,但没有找到任何其他建议的解决方案,但是,我确实解决了团队项目的问题。

    我就是这么做的-

    • 创建了一个新的类对象(项目->添加类)
    • 通过解决方案资源管理器重命名了该文件,并在询问是否要自动重命名所有引用以匹配时单击"是"。

    这是我为解决这个问题所做的-

    • 转到团队资源管理器主页
    • 单击源代码管理资源管理器
    • 钻取到所有类/项目文件所在的文件夹
    • 在列表中找到原始文件名并通过右键单击将其删除
    • 建造

    如果是这样的话,那就额外确保删除的是幻影文件,而不是项目中要保留的实际文件。


    对我来说,它是项目内部"header files"上不存在的头文件。删除此条目(右键单击>从项目中排除)后,第一次重新编译,然后直接

    =====生成:0成功,0失败,5最新,0跳过===========

    没有人试图在没有修改的情况下进行重建。我认为这是一个在VS2010实现的构建之前的检查(不确定是否有文档记录,可能有),它会触发"AlwaysCreate"标志。


    如果您使用的是命令行msbuild命令(而不是Visual Studio IDE),例如,如果您的目标是appveyor,或者您只喜欢命令行,则可以将此选项添加到msbuild命令行:

    1
    /fileLoggerParameters:LogFile=MyLog.log;Append;Verbosity=diagnostic;Encoding=UTF-8

    如本文所述(警告:通常的MSDN详细信息)。生成完成后,在生成期间创建的日志文件中搜索字符串will be compiledMyLog.log


    对于我来说,这个问题出现在一个WPF项目中,其中一些文件的"build action"属性设置为"resource",而"copy to output directory"设置为"copy if new"。解决方案似乎是将"复制到输出目录"属性更改为"不复制"。

    msbuild知道不将"resource"文件复制到输出中,但如果不存在,仍会触发生成。也许这会被认为是一个错误?

    这里的答案非常有帮助,它暗示了如何让msbuild将beans泄漏到为什么它一直在构建所有东西上!


    我遇到了这个问题,发现了:

    http://curlybrace.blogspot.com/2005/11/visual-c-project-continuously-out-of.html

    Visual C++ Project continually out-of-date (winwlm.h macwin32.h rpcerr.h macname1.h missing)

    Problem:

    In Visual C++ .Net 2003, one of my projects always claimed to be out of date, even though nothing had changed and no errors had been reported in the last build.

    Opening the BuildLog.htm file for the corresponding project showed a list of PRJ0041 errors for these files, none of which appear on my system anywhere:
    winwlm.h macwin32.h rpcerr.h macname1.h

    Each error looks something like this:

    1
      MyApplication : warning PRJ0041 : Cannot find missing dependency 'macwin32.h' for file 'MyApplication.rc'.

    Your project may still build, but may continue to appear out of date until this file is found.

    Solution:

    Include afxres.h instead of resource.h inside the project's .rc file.

    The project's .rc file contained"#include resource.h". Since the resource compiler does not honor preprocessor #ifdef blocks, it will tear through and try to find include files it should be ignoring. Windows.h contains many such blocks. Including afxres.h instead fixed the PRJ0041 warnings and eliminated the"Project is out-of-date" error dialog.


    我花了好几个小时把头发扯下来。构建输出不一致;不同的项目由于从一个构建到下一个连续构建的不同原因而"不是最新的"。我最终发现罪魁祸首是Dropbox(3.0.4)。我将源文件夹从……Dropbox连接到我的项目文件夹中(不确定这是不是原因),但Dropbox在构建过程中不知何故"接触"了文件。暂停同步,所有内容始终保持最新。


    有很多潜在的原因,如前所述,您需要首先通过将msbuild详细性设置为"诊断"来诊断它们。大多数情况下,所述的原因是不言自明的,您可以立即对其采取行动,但有时msbuild会错误地声称某些文件已被修改,需要复制。

    如果是这种情况,您需要禁用NTFS隧道或将输出文件夹复制到新位置。这里有更多的话。


    在我的例子中,其中一个项目包含多个IDL文件。MIDL编译器为每个文件生成一个名为"dll data.c"的dll数据文件,而不管IDL文件名如何。这导致Visual Studio在每次生成时都编译IDL文件,即使不更改任何IDL文件。

    解决方法是为每个IDL文件配置一个唯一的输出文件(即使省略了/dlldata开关,MIDL编译器也总是生成这样的文件):

    • 右键单击IDL文件
    • 选择属性-MIDL-输出
    • 为dlldata文件属性输入唯一的文件名

    如果更改项目的调试命令参数,也会触发"需要重新生成项目"消息。即使目标本身不受调试参数的影响,项目属性也已更改。但是,如果确实要重建,则消息应该消失。


    我有一个VC++项目,它总是编译所有文件,并且以前已经从VS2005升级到了VS2010(由其他人)。我发现项目中除了stdafx.cpp之外的所有cpp文件都设置为创建预编译头(/yc)。我修改了这个,所以只有stdafx.cpp被设置为创建预编译头,其余的被设置为使用预编译头(/yu),这为我解决了这个问题。


    这件事发生在我身上好几次,在我弄明白原因之前就消失了。在我的案例中是:

    双引导设置中的系统时间错误!

    原来,我和Ubuntu的双引导是根本原因!!我太懒了,没法把Ubuntu修好,别再弄乱我的硬件时钟了。当我登录Ubuntu时,时间向前跳跃了5个小时。

    倒霉的是,我建了一个项目,用错误的系统时间,然后改正了时间。因此,所有的构建文件都有错误的时间戳,而vs会认为它们都已过时,并会重新构建项目。


    另一个关于Visual Studio 2015 SP3的问题,但几年前我在Visual Studio 2013上遇到过类似的问题。

    我的问题是,在预编译头中使用了错误的cpp文件(所以我有两个创建预编译头的cpp文件)。现在,为什么在没有我的请求的情况下,Visual Studio将错误cpp上的标志更改为"创建预编译头",我对此一无所知,但事实确实如此……可能是插件什么的????

    无论如何,错误的cpp文件包括在每次生成时都会更改的版本.h文件。因此,Visual Studio会重建所有的头部,因此整个项目都是这样。

    好吧,现在又恢复正常了。


    大多数构建系统使用数据时间戳来确定何时应该进行重建-根据依赖项的上次修改时间检查任何输出文件的日期/时间戳-如果任何依赖项更新鲜,则重建目标。

    如果任何依赖项以某种方式获得无效的数据时间戳,这可能会导致问题,因为很难使任何生成输出的时间戳超过将来可能创建的文件的时间戳:p


    我对Visual Studio 2005也有类似的问题,我的解决方案包括以下依赖项中的五个项目(首先构建在顶部):

    1
    2
    3
    4
    5
    Video_Codec depends on nothing
    Generic_Graphics depends on Video_Codec
    SpecificAPI_Graphics depends on Generic_Graphics
    Engine depends on Specific_Graphics
    Application depends on Engine.

    我发现视频编解码器项目需要一个完整的构建,即使在彻底清理后,然后重建解决方案。

    我通过确保C/C++和链接器的EDCOX1×0输出文件匹配其他工作项目所使用的位置来修复这个问题。我还打开了RTTI。


    .NET项目总是重新编译而不管。其中一部分是保持IDE的最新(如IntelliSense)。我记得几年前在一个微软论坛上问过这个问题,这就是我得到的答案。