VS2013常见错误排查
1. CMemDC重定义
1>nafxcwd.lib(afxglobals.obj) : error LNK2005: "public: virtual __thiscall CMemDC::~CMemDC(void)" (??1CMemDC@@UAE@XZ) 已经在 DMGraphicView.obj 中定义
原因:上面是意思是,连接器说,我找到了两个定义,一个在 uafxcwd.lib(afxglobals.obj)里面,还有一个在MultiColorPlotCtrl.obj 。工程中有一个MemDC.h文件,里面定义了一个CMemDC类,不巧的是,VS2010的MFC新增了这个类,所以链接时会出问题。
解决方法:
1 修改MFC中CMemDC的名字。这个明显不行。。。
2 将emule中的CMemDC改个名字,这个方法可以,可是我找了下,貌似用这个类的文件还不少。不甘心一条条改,于是想出下面的方法。。。
3 增加一个宏定义,
#define CMemDC XCMemDC
将上面的语句加到stdafx.h的最后。(也可以在工程属性页中以编译器指令的形式定义宏,格式为 /D "CMemDC=XCMemDC")。
2 将emule中的CMemDC改个名字,这个方法可以,可是我找了下,貌似用这个类的文件还不少。不甘心一条条改,于是想出下面的方法。。。
3 增加一个宏定义,
#define CMemDC XCMemDC
将上面的语句加到stdafx.h的最后。(也可以在工程属性页中以编译器指令的形式定义宏,格式为 /D "CMemDC=XCMemDC")。
2.error C2440 “static_cast” 无法从“void (__thiscall CPppView )(void)”转换为“LRESULT (__thiscall CWnd )(WPARAM,LPARAM)”
解决方法:
首先,把原来的消息函数返回值类型改为LRESULT,函数内可以随便写个return TRUE; 然后消息函数的参数必须改写成(WPARAM wParam,LPARAM lParam)而不论这两个参数是否用得到;最后,消息映射如ON_MESSAGE(WM_message,& OnMyMessage)
3.fatal error C1083: 无法打开包括文件: “fstream.h”: No such file or directory
#include<fstream.h>
改为
#include <fstream>
using namespace std;
4.error LNK2026: 模块对于 SAFESEH 映像是不安全的
解决方法:1.打开该项目的“属性页”对话框。
2.单击“链接器”文件夹。
3.单击“命令行”属性页。
4.将 /SAFESEH:NO 键入“附加选项”框中,然后点击应用。
5.error C4996: 'fopen': This function or variable may be unsafe
解决方案,项目 ->属性 -> c/c++ -> 预处理器 -> 点击预处理器定义,编辑,加入_CRT_SECURE_NO_WARNINGS,即可6.fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
VS2010在经历一些更新后,建立Win32 Console Project时会出“error LNK1123” 错误,解决方案为将 项目|项目属性|配置属性|清单工具|输入和输出|嵌入清单 “是”改为“否”即可,但是没新建一个项目都要这样设置一次。
在建立VS2010 Win32 Project项目时,按照上面解决方案依然发生了“error LNK1123”错误,经过上网查资料,解决方案为:
第一步:与上相同。
第二步:将 项目|项目属性|配置属性|连接器|清单文件|嵌入清单 “是”改为“否”。
第三步:一般计算机经过上两步设置就能解决问题了,但是如果还有问题,那就按一下方法解决:
计算机是否为64bit操作系统,如是,继续2。
查找是否有两个cvtres.exe。一个是C:\Program Files(x86)\Microsoft Visual Studio 10.0\vc\bin\cvtres.exe, 另一个是C:\Windows\Microsoft.NET\Framework\v
4.0.30319\cvtres.exe。右键属性|详细信息 查看两者版本号,删除/重命名较旧的版本,或者重新设置Path变量。
在建立VS2010 Win32 Project项目时,按照上面解决方案依然发生了“error LNK1123”错误,经过上网查资料,解决方案为:
第一步:与上相同。
第二步:将 项目|项目属性|配置属性|连接器|清单文件|嵌入清单 “是”改为“否”。
第三步:一般计算机经过上两步设置就能解决问题了,但是如果还有问题,那就按一下方法解决:
计算机是否为64bit操作系统,如是,继续2。
查找是否有两个cvtres.exe。一个是C:\Program Files(x86)\Microsoft Visual Studio 10.0\vc\bin\cvtres.exe, 另一个是C:\Windows\Microsoft.NET\Framework\v
4.0.30319\cvtres.exe。右键属性|详细信息 查看两者版本号,删除/重命名较旧的版本,或者重新设置Path变量。
7.“CException”: 不能实例化抽象类
有时候程序在VC6.0中运行是正常的,但是用VS2008打开时会出现 CException不能实例化抽象类的问题。这是由于VC6.0 与VS2008对于CException类的定义不同。
解决方案:
MFC较好地将异常封装到CException类及其派生类中,自成体系,下表给出了MFC 提供的预定义异常:
异常类 |
含义 |
CMemoryException |
内存不足 |
CFileException
|
文件异常 |
CArchiveException |
存档/序列化异常 |
CNotSupportedException |
响应对不支持服务的请求 |
CResourceException |
Windows 资源分配异常 |
CDaoException |
数据库异常(DAO 类) |
CDBException |
数据库异常(ODBC 类) |
COleException |
OLE 异常 |
COleDispatchException |
调度(自动化)异常 |
CUserException |
用消息框警告用户然后引发一般 CException 的异常 |
8.fatal error LNK1104: 无法打开文件“LIBC.lib”
解决方法见图
9. error C2440: “static_cast”: 无法从“UINT (__thiscall CTestDlg::* )(CPoint)”转换为 .
从vc6转移到vs2005 发生下面问题:BEGIN_MESSAGE_MAP(CTestDlg, CCaptionBtnDlg)
ON_WM_NCHITTEST() //vs2005 检测错误在这里
END_MESSAGE_MAP()
afx_msg UINT OnNcHitTest(CPoint point);
UINT CTestDlg::OnNcHitTest(CPoint point)
{
....
}
解决方法:
afx_msg UINT OnNcHitTest(CPoint point);
UINT CTestDlg::OnNcHitTest(CPoint point)
=>
afx_msg LRESULT OnNcHitTest(CPoint point);
LRESULT CTestDlg::OnNcHitTest(CPoint point)
10.MFC does not support WINVER less than 0x0501
打开stdafx.h,作如下修改:
#define WINVER 0x0400
改为
#define WINVER 0x0501
改为
#define WINVER 0x0501
#define _WIN32_WINNT 0x0400
改为
#define _WIN32_WINNT 0x0501
改为
#define _WIN32_WINNT 0x0501
11.错误 1 error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
解决方案,项目 ->属性 -> c/c++ -> 预处理器 -> 点击预处理器定义,编辑,加入_CRT_SECURE_NO_WARNINGS,即可
版权声明: