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.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变量。

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 的异常

所以只要把上面的CException与异常类相对应的就行!!!比如文件异常,改成CFileException就行!


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 _WIN32_WINNT 0x0400  
改为
#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,即可

你可能感兴趣的:(VC)