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

Chr*_*s U 193 visual-studio-2010 visual-studio

我有一个非常类似的问题,如这里所述.

我还将C++/CLI和C#项目的混合解决方案从Visual Studio 2008升级到Visual Studio 2010.现在,在Visual Studio 2010中,一个C++/CLI项目总是过时.

即使它刚刚被编译和链接F5并被点击,消息框"项目已经过时了.你想构建它吗?" 出现.这非常烦人,因为DLL文件非常低层,并且几乎所有项目的解决方案都要重建.

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

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

任何其他想法为什么Visual Studio 2010表现如此?

Mos*_*osc 224

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

要查找丢失的文件,请使用文章启用C++项目系统日志记录中的信息以在Visual Studio中启用调试日志记录,并让它告诉您导致重建的原因:

  1. 打开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.
  2. </configSections>在行之后添加以下内容:

    <system.diagnostics>
      <switches>
        <add name="CPS" value="4" />
      </switches>
    </system.diagnostics>
    
    Run Code Online (Sandbox Code Playgroud)
  3. 重新启动Visual Studio
  4. 打开DbgView并确保它捕获调试输出
  5. 尝试调试(在Visual Studio中点击F5)
  6. 在调试日志中搜索表单的任何行:

    devenv.exe信息:0:项目'Bla\Bla\Dummy.vcxproj'不是最新的,因为缺少构建输入'Bla\Bla\SomeFile.h'.

    (我只是按Ctrl + F并搜索not up to date)这些将是导致项目永远"过时"的引用.

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

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

<system.diagnostics>
  <switches>
   <add name="CPS" value="Verbose" />
  </switches>
</system.diagnostics>
Run Code Online (Sandbox Code Playgroud)

  • >打开DbgView并确保它捕获调试输出.如何确保捕获已开始?我对重建项目有同样的问题.但是DebugView中没有任何信息.我在DebugView的"Capture"菜单中启用了前5个选项.(并感谢回答中的良好链接!) (4认同)
  • 如果您使用的是VS2012,则要粘贴到配置文件中的代码段略有不同.这与原始文章相关联,但以防万一:[启用C++和Javascript项目系统跟踪VS2012](http://blogs.msdn.com/b/andrewarnottms/archive/2012/06/07/enable-c-和JavaScript的项目系统tracing.aspx) (4认同)
  • 这有助于我们弄明白; 但是,在最后一个.H引用消失之前,我们还必须删除我们的中间构建目录 - 可能是为了刷新StdAfx.obj?无论如何,删除所有中间构建文件夹并清理项目文件后,我们也很高兴. (3认同)
  • 仅供参考,这在VS2013中似乎不再起作用 - 在编辑配置文件之后,它不会在DebugView中生成任何感兴趣的内容. (3认同)
  • 谢谢 - 现在为什么不在常规输出窗口中? (2认同)
  • 对于VS2012/VS2013,您最好采用其他方法; 只需将MSBuild项目构建输出详细程度设置为Diagnostic,并检查输出是否"不是最新". (2认同)

Sta*_*lav 166

在Visual Studio 2012中,我能够比在公认的解决方案中更容易地实现相同的结果.

我更改了菜单工具选项项目和解决方案构建和运行 →*MSBuild项目构建输出详细程度"中的选项"从MinimalDiagnostic.

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

项目'blabla'不是最新的.项目项'c:\ foo\bar.xml'将'复制到输出目录'属性设置为'始终复制'.

  • 使用C#,我找不到任何"不是最新"的东西,这个神奇的词似乎是"比新的更新" (7认同)
  • 这也适用于VS2013,其中配置文件调整似乎不再起作用. (6认同)
  • +1.顺便说一下,VS2010中存在相同的设置. (5认同)
  • `1>项目不是最新的,因为构建输入'C:\ ...\ReadMe.txt'缺失.:O !!?! (3认同)
  • 在VS2013中,您可能还必须在诊断模式下搜索`was modified at`,因为我没有"不是最新的"输出. (3认同)

小智 59

今天发生在我身上.我能够找到原因:该项目包含一个磁盘上不再存在的头文件.

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

  • 不,我没有任何磁盘上不存在的头文件.但是你怎么能追查原因呢?你是怎么发现丢失文件的?也许我可以像你一样以同样的方式查询我的问题. (2认同)

小智 15

我们也遇到了这个问题并找到了如何解决它.

问题如上所述"磁盘上不再存在该文件".

这不太正确.该文件确实存在于磁盘上,但.VCPROJ文件正在其他位置引用该文件.

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

一个有效的问题是:如果Visual Studio不知道包含文件的位置,它如何构建?

我们认为.vcproj文件在Visual Studio GUI中没有显示某个有问题的文件的相对路径,这就解释了即使包含的树视图不正确,项目实际构建的原因.

  • VC可以构建的原因是因为它们是头文件 - 并且头文件实际上不会被编译.如果.C/.CPP文件实际使用了任何头文件,那么构建将失败.因此依赖性检查器(查找头文件)将项目标记为需要重建,但实际的编译器(只是忽略头文件列表)可以成功. (4认同)
  • 令人难以置信......如果你的.vcxproj文件中有一个*text*文件(即使它确实存在,甚至不是构建的一部分),也会发生这种情况.我用向导生成了一个项目,它包含一个ReadMe.txt文件,我从磁盘上删除了该文件,但忘记从vcxproj中删除. (4认同)
  • 什么是"包含文件视图",你是如何做到的? (2认同)

Nev*_*der 12

接受的答案帮助我找到了解决这个问题的正确途径,因为我必须开始合作.但是,我不得不处理大量错误的包含标头.使用详细的调试输出,删除一个导致IDE冻结30秒,同时输出调试spew,这使得进程非常缓慢.

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

例:

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)
  ...
Run Code Online (Sandbox Code Playgroud)

源代码:

#!/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 + ")")
Run Code Online (Sandbox Code Playgroud)


小智 7

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

事实上,编译器使用的每个文件都放在临时目录的*.tlog文件中.删除文件时,不会更新此*.tlog文件.这是增量构建使用的文件,用于检查您的项目是否是最新的.

手动编辑此.tlog文件或清理项目并重建.


小智 6

我有类似的问题,但在我的情况下没有文件丢失,pdb输出文件的定义方式有错误:我忘了后缀.pdb(我发现了调试日志技巧).

要解决我在vxproj文件中更改的问题,请执行以下操作:

<ProgramDataBaseFileName>MyName</ProgramDataBaseFileName>
Run Code Online (Sandbox Code Playgroud)

<ProgramDataBaseFileName>MyName.pdb</ProgramDataBaseFileName>
Run Code Online (Sandbox Code Playgroud)


Bim*_*Bim 6

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

  1. "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).
    要修复它,只需将文件名清除为""(空字段).

  2. "Forcing rebuild of all source files due to a change in the command line since the last build."
    这似乎也是一个已知的VS错误(https://connect.microsoft.com/VisualStudio/feedback/details/833943/forcing-rebuild-of-all-source-files-due-to-a-change-in- -com -line-since-the-last-build)似乎在较新版本中修复(但不是VS2013).我知道没有解决方法,但如果你这样做,请务必在此发布.