Visual Studio 2010始终认为项目已过期,但实际上没有任何更改。

197

我有一个非常类似于这里描述的问题。

我也将一个包含C++/CLI和C#工程的混合解决方案从Visual Studio 2008升级到了Visual Studio 2010。在Visual Studio 2010中,一个C++/CLI工程总是过期。

即使它已经在编译和链接之前完成,按下F5,消息框"该项目已过期。您想要构建它吗?"会出现。这非常烦人,因为DLL文件是低级别的,强制几乎所有的解决方案重新构建。

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

是否有可能找到Visual Studio 2010强制重建或认为某个工程是最新的原因?

其他任何关于Visual Studio 2010出现这种情况的想法?


请参考以下链接:https://dev59.com/O43da4cB1Zd3GeqPxEDH - newdazhu
请参考以下链接:https://dev59.com/O43da4cB1Zd3GeqPxEDH - newdazhu
30个回答

4
Visual Studio 2013——“由于缺少PDB而强制重新编译所有源文件”。 我开启了详细的构建输出来定位问题:我在“工具”→“项目和解决方案”→“生成和运行”下启用了“详细”构建输出。我的项目有几个,都是C++,我在项目设置下把(C/C++ → Debug Information Format)选项设置为程序数据库(/Zi)来处理问题项目。 然而,这并没有解决该项目的问题。问题来自解决方案中的其他C ++项目之一。
我将所有 C++ 项目设置为“程序数据库(/Zi)”,并解决了这个问题。
同样,报告问题的项目并不是有问题的项目。尝试将所有项目设置为“程序数据库(/Zi)”以解决问题。

关于详细构建输出设置,VS2015与之前版本相同。 - LOAS

3
今天我遇到了这个问题,不过有些不同。我的解决方案中有一个CUDA DLL项目。在干净的解决方案中编译是可以的,但是在其他情况下会失败,并且编译器总是将CUDA DLL项目视为不是最新的。
我尝试了这篇文章中提供的解决方案。
但是在我的解决方案中没有缺少的头文件。然后我发现了我的问题所在。
我之前改变了项目的Intermediate Directory,虽然它没有引起麻烦。现在当我将CUDA DLL项目的Intermediate Directory改回$(Configuration)\时,一切都正常了。 我猜测CUDA Build Customization和非默认Intermediate Directory之间存在一些小问题。

使用VS2013(C#),我尝试设置IntermediateOutputPath。如果这指向与解决方案不同的驱动器上的文件夹,则增量构建将停止工作-MSBuild会抱怨某些源文件始终过时于某些中间文件(通常是PDB)。请参见[我的博客文章](http://ugumba.wordpress.com/2014/03/19/visual-studio-insists-projects-are-out-of-date-when-intermediateoutputpath-is-on-different-drive/)。 - Robert Schmidt

3
我有类似的问题,并按照上面的指示(被接受的答案)来定位缺失的文件,但不是没有费些周折。以下是我所做的事情的总结。准确地说,这些并不是缺失的文件,因为它们在项目构建中不是必需的(至少在我的情况下),但它们是对不存在的磁盘文件的引用,而这些文件实际上并不需要。

以下是我的经历:

  1. 在 Windows 7 中,该文件位于 %ProgramFiles(x86)%\Microsoft Visual Studio 10.0\Common7\IDE\%。有两个相似的文件 devenv.exe.config.configdevenv.exe.config。你需要更改后者。

  2. 在 Windows 7 中,你无法在程序文件夹内编辑此文件。只需将其复制到其他地方(如桌面)进行更改,然后再将其复制回程序文件夹。

  3. 我试图弄清楚如何将DebugView连接到 IDE 以查看缺失的文件。好的,你不需要做任何事情。只需运行它,它就会捕获所有消息。确保在默认情况下应选择的 Capture 菜单中选择了 Capture Events 菜单选项。

  4. DebugView 不会一次显示所有缺失的文件(至少对我来说不是这样的)!你需要先运行 DebugView,然后再在 Visual Studio 2010 中运行项目。它会提示“project out of date”消息,请选择Yes以构建,DebugView 将显示缺失或导致重建的第一个文件。在 Notepad 中打开项目文件(而不是解决方案文件)并搜索该文件并删除它。最好在删除时关闭项目并重新打开它。重复此过程,直到 DebugView 不再显示任何缺失的文件。

  5. 从 DebugView 工具栏按钮或 EditFilter/Highlight 选项设置消息筛选器为 not up to date 对于显示仅包含 `not up to date' 字符串的消息是非常有帮助的。

我有很多不必要的文件,删除它们后按照上述步骤解决了问题。

找到所有缺失文件的第二种方法

有第二种方法可以一次性找到所有这些文件,但需要 (a) 源代码控制和 (b) 将其与 Visual Studio 2010 集成。使用 Visual Studio 2010,将项目添加到所需位置或源代码控制中的虚拟位置。它会尝试添加所有文件,包括那些在项目文件中引用但在磁盘上不存在的文件。进入源代码控制软件,如 Perforce,它应该以不同的颜色方案标记这些不存在于磁盘上的文件。Perforce 会在它们上面显示一个黑色锁。这些是你缺失的引用。现在你有了一个列表,你可以使用记事本从项目文件中删除它们,你的项目就不会再抱怨“过时”了。


2

如果您正在使用命令行MSBuild命令(而不是Visual Studio IDE),例如如果您的目标是AppVeyor或者您只是更喜欢命令行,那么您可以在MSBuild命令行中添加此选项:

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

根据此处的记录(警告:通常MSDN很啰嗦),当构建完成后,在构建期间创建的日志文件MyLog.log中搜索字符串will be compiled


1
/verbosity:detailed 也可以提供相同的信息,但不是很冗长。然后您可以搜索“将被编译为”。 - Shane Gannon
1
你还应该搜索“需要源代码编译”,这样也可以找到相关链接。 - Shane Gannon

2
我正在使用带有Update 4的Visual Studio 2013专业版,但没有找到任何其他建议的分辨率。然而,我确实成功解决了我的团队项目的问题。
以下是我导致问题的步骤:
- 创建一个新的类对象(项目 -> 添加类) - 通过“解决方案资源管理器”重命名文件,并在询问是否自动重命名所有引用以匹配时选择“是”
以下是我解决问题的步骤:
- 转到“团队资源管理器主页” - 单击“源代码控制资源管理器” - 进入包含所有类/项目文件的文件夹 - 在列表中找到原始文件名,右键单击并删除 - 构建
如果您也遇到此情况,请务必确保删除幻影文件而不是您想要保留在项目中的实际文件。

2
对我来说,问题在于项目中“头文件”中存在一个不存在的头文件。删除此条目(右键单击>从项目中排除)后,首次重新编译,然后直接执行以下操作:
========== 构建:0 成功,0 失败,5 最新,0 跳过 ==========
没有进行任何修改的情况下尝试重新构建。我认为这是VS2010实施的检查-构建(不确定是否记录在案,可能有),它触发了“AlwaysCreate”标志。

1
有很多潜在原因,正如所述,您需要首先将MSBuild详细程度设置为“诊断”来诊断它们。大多数情况下,陈述的原因都是不言自明的,您可以立即采取行动,但偶尔MSBuild会错误地声称某些文件已被修改并需要复制。
如果是这种情况,您需要禁用NTFS隧道或将输出文件夹复制到新位置。更多信息请点击此处

1

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

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


是否有可能获取VS2010强制重新构建或认为项目是最新的原因? - Chris U
在VS6或者可能是VS2005中,右键单击一个项目时会出现一个奇怪的属性对话框,其中显示了项目中每个文件的依赖关系和输出。我不知道如何在VS2008(或VS2010)中获得相应的报告。 - Chris Becke

1
在我的情况下,其中一个项目包含多个IDL文件。无论IDL文件名如何,MIDL编译器都会为每个文件生成一个名为“dlldata.c”的DLL数据文件。这导致Visual Studio在每次构建时编译IDL文件,即使没有对任何IDL文件进行更改也是如此。
解决方法是为每个IDL文件配置唯一的输出文件(即使省略了/dlldata开关,MIDL编译器仍然会生成这样的文件):
右键单击IDL文件 选择属性 - MIDL - 输出 为DllData文件属性输入唯一的文件名

1
我在这件事上花费了许多时间梳理头发。构建输出不一致;不同的项目在连续的不同构建中因不同原因“未更新到最新状态”。最终,我发现罪魁祸首是DropBox(3.0.4)。我将我的源文件夹从...\ DropBox 映射到我的项目文件夹(不确定是否是原因),但是DropBox在构建期间以某种方式“触及”文件。暂停同步后,所有内容均保持最新状态。

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