"stdafx.cpp"编译引起的C2859、C1083、LNK2001错误

本文详细记录了解决使用VC2005修改工程文件结构后出现的C2859和C1083错误的过程,通过调整预编译文件设置和手动管理问题文件,最终成功解决错误并完成工程重建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转:http://blog.sina.com.cn/s/blog_48f93b530100fkcg.html

今天在VC2005中修改一个工程的文件结构,将"stdafx.cpp"文件挪动了位置,编译时出现C2859错误,具体信息如下:

    errorC2859: e:\projects\apptest\src\debug\vc80.pdb is not the pdb file that was used whenthis precompiled header was created, recreate the precompiledheader. e:\projects\apptest\src\mainapp.cpp 4 

    errorC2859: e:\projects\apptest\src\debug\vc80.idb is not the idb file that was used whenthis precompiled header was created, recreate the precompiledheader. e:\projects\apptest\src\mainapp.cpp 4 

 

   按照提示要求,clean编译文件,rebuild工程,还是一样的问题。发现debug文件夹下总是有一个mainapp.pch文件(预编译文件),即使clean也不会删除。将该文件手动删除,rebuild工程,出现C1083错误:

    fatalerror C1083: Cannot open precompiled header file:'Debug\MainApp.pch': No such file ordirectory e:\projects\apptest\src\mainapp.cpp 4 

   查看工程设置properties -> Configuration Properties-> C/C++ -> Precompiled Headers,为“UsePrecompiled Headers (/Yu)”,所以预编译文件mainapp.pch不会自动生成;改为“CreatePrecompiled Headers (/Yc)”,rebuild工程,ok。

   但是工程原来的设置“Use Precompiled Headers(/Yu)”是可以编译成功的啊,于是再改回原来的设置,build,出现LNK2001错误:

    errorLNK2001: unresolved external symbol "int __cdecl _AfxInitManaged(void)" (?_AfxInitManaged@@YAHXZ) mfcs80ud.lib 

 

   百思不得其解,google上找答案,原来VC对于预编译的设置是这样的:

    1、"stdafx.cpp"文件的预编译选项永远是“CreatePrecompiled Headers (/Yc)”;

   2、工程的预编译选项一般为“Use Precompiled Headers (/Yu)”。

   可知"stdafx.cpp"文件的预编译选项一般与工程的预编译选项设置是不同的,也就是说每次build工程时,"stdafx.cpp"文件都要生成预编译文件*.pch,而其他cpp文件则直接用这个文件进行编译。于是选中"stdafx.cpp"文件,右键“Properties”,选择“AllConfigurations”,将预编译选项设置为“Create Precompiled Headers(/Yc)”,再次rebuild,一切ok。

 

   回忆引起出错的操作,是从工程中删除"stdafx.cpp"文件后又添加到工程中的。看来VC框架生成的工程会自动将"stdafx.cpp"文件的预编译选项设置好,如果用户手动添加该文件的话,预编译选项将会与工程的选项相同。打开一个以前的MFC工程查看,果然验证了自己的想法。
--------------------Configuration: My - Win32 Debug-------------------- Compiling resources... Compiling... StdAfx.cpp Compiling... My.cpp MainFrm.cpp MyDoc.cpp MyView.cpp F:\My\MyView.cpp(59) : error C2065: 'dotMatrix_Liu' : undeclared identifier F:\My\MyView.cpp(59) : error C2109: subscript requires array or pointer type F:\My\MyView.cpp(59) : error C2109: subscript requires array or pointer type F:\My\MyView.cpp(108) : error C2039: 'DrawVectorName' : is not a member of 'CMyView' f:\my\myview.h(13) : see declaration of 'CMyView' F:\My\MyView.cpp(116) : error C2084: function 'const struct AFX_MSGMAP *__stdcall CMyView::_GetBaseMessageMap(void)' already has a body F:\My\MyView.cpp(116) : error C2084: function 'const struct AFX_MSGMAP *__thiscall CMyView::GetMessageMap(void) const' already has a body F:\My\MyView.cpp(116) : error C2374: 'protected: static struct AFX_MSGMAP const CMyView::messageMap' : redefinition; multiple initialization f:\my\myview.h(54) : see declaration of 'protected: static struct AFX_MSGMAP const CMyView::messageMap' F:\My\MyView.cpp(116) : error C2374: 'private: static struct AFX_MSGMAP_ENTRY const * const CMyView::_messageEntries' : redefinition; multiple initialization f:\my\myview.h(54) : see declaration of 'private: static struct AFX_MSGMAP_ENTRY const * const CMyView::_messageEntries' F:\My\MyView.cpp(118) : error C2509: 'OnKeyDown' : member function not declared in 'CMyView' f:\my\myview.h(13) : see declaration of 'CMyView' F:\My\MyView.cpp(123) : error C2040: 'dotMatrix_Liu' : 'unsigned char [16][16]' differs in levels of indirection from 'int' Generating Code... 执行 cl.exe 时出错. My.exe - 1 error(s), 0 warning(s) 怎么解决
03-19
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值