在调试模式下尝试将预编译头文件与 VS2010 (VC100) 一起使用时,如何消除错误 C2859?

Posted

技术标签:

【中文标题】在调试模式下尝试将预编译头文件与 VS2010 (VC100) 一起使用时,如何消除错误 C2859?【英文标题】:How do I eliminate error C2859 when trying to use a precompiled header with VS2010 (VC100) in debug mode? 【发布时间】:2010-07-01 06:42:28 【问题描述】:

我正在尝试升级旧解决方案以使用 VS2010 (VC100)。

我已经设置好了,stdafx.cpp 将从 stdafx.h 创建一个预编译的头文件 stdafx.pch。然后指示包含 stdafx.h 的所有其他 .cpp 文件使用预编译头。

这些帖子帮助我走到了这一步:

Visual C++ Precompiled Headers errors Precompiled Headers

当我在发布模式下构建时,一切都很好。但是,当我尝试在调试模式下构建时,我收到一大堆错误消息:

Error 1 error C2859: [removed]\debug\vc100.idb 不是创建此预编译头时使用的 idb 文件,重新创建预编译头。

我相信这个.idb文件是Visual Studio创建的中间调试文件。

为什么会出现此错误?换句话说,为什么它在创建预编译头时不使用这个.idb文件?

我不确定您需要什么进一步的信息才能给我答案,所以请询问我是否需要提供更多信息。

【问题讨论】:

【参考方案1】:

感谢一位同事,我得到了答案。

问题在于 stdafx.cpp 将调试信息格式设置为程序数据库 (/Zi),而所有其他文件都将其设置为用于编辑和继续的程序数据库 (/ZI)。

将它们全部更改为 Program Database for Edit and Continue (/ZI) 并进行完全重建解决了问题。

我猜这次升级搞砸了。

【讨论】:

【参考方案2】:

在编译 $(ProjectName) 与项目的实际输出文件不同的项目时,我在 VS2005 中遇到此错误(即 Linker > Output File 未设置为默认值$(OutDir)\$(ProjectName).exe 但用于其他内容,例如 $(OutDir)\$(ProjectName)-custom_postfix.exe)

在这种情况下,显然在进行 Rebuild-Project-Only 时,vc80.pdb 似乎被错误地查找了。

帮助我的是另外将C/C++ > Output Files > Progam Database File Name 设置为$(IntDir)\$(TargetName).pdb。 (而不是默认的vc80.pdb

【讨论】:

我也遇到过类似的情况(使用自定义名称,工作正常,然后突然遇到这个错误),但解决方法很简单,手动删除输出文件并重建。 @iX3:删除 .pdb 文件仅在您尝试重建解决方案之前有帮助。然后它将再次失败并出现相同的错误。 Martin Ba 的初步回答为我解决了这个问题。【参考方案3】:

在 stdafx.cpp 的属性页面中为调试信息格式选择禁用,然后返回并选择从父级继承为我工作。

【讨论】:

【参考方案4】:

也许您的发布版本配置为写入文件 [removed]\debug\vc100.idb 而不是 [removed]\release\vc100.idb?检查发布版本的项目设置,并确保没有类似的硬编码路径组件。

【讨论】:

发布版本不会生成 idb 文件,因为它仅用于调试。因此,为什么发布版本有效而​​调试无效。 默认情况下发布版本不会生成 idb 文件,但您可以对其进行配置(很可能是偶然的)。 谢谢,我想通了,哈哈。这与调试信息格式设置有关。【参考方案5】:

这是我刚刚在 Visual Studio 2008 上修复此错误的方法:

背景:

我有一个包含两个子项目的解决方案。 一个项目编译.dll; 一个项目编译使用这个.dll的.exe; .exe 项目依赖于 .dll 项目; 问题:我让两个项目将它们的输出转储到同一个目录中,即“OutPutDirectory”和“IntermediateDirectory”都设置为写入根目录中的公共目录“../$(ConfigurationName)”。

错误原因:

这个错误的原因是在编译.dll项目时,在与.exe目录相同目录下创建了预编译头文件(*.pch),当.exe项目被编译后,它立即覆盖了 .dll 项目中的预编译头文件 (*.pch)。

修复:

为解决此问题,我将两个子项目的“IntermediateDirectory”更改为“temp”,以便将临时文件(包括预编译的头文件)写入不同的目录。

【讨论】:

以上是关于在调试模式下尝试将预编译头文件与 VS2010 (VC100) 一起使用时,如何消除错误 C2859?的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2010 新项目向导制造的 MFC Dialog 程序在调试模式下无法编译?

用vs2015写c++,编译报错项目已过期,怎么回事?

在VS2010的VC++中如何编译、链接、运行、调试程序

gccrelease模式设置断点

求问vs2013怎么添加静态库,试了两种方法都有问题

如何将预编译的二进制文件与电子捆绑在一起