在调试模式下尝试将预编译头文件与 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?的主要内容,如果未能解决你的问题,请参考以下文章