环境:MFC条件下添加原有代码html
1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj) 1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMTD.lib(dbgdel.obj) 1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in LIBCMTD.lib(new2.obj) 1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z) already defined in LIBCMTD.lib(delete2.obj)
由于是改师姐的代码(→.→,师姐V5),师姐的代码并不是在MFC的环境下运行的,故产生了error LNK2005错误,上网一搜,明白了其出错缘由,这里想必你们都已经查到了,那我就再啰嗦一遍吧,按照微软的官方解释是这样的:CRT 库对 new、delete 和 DllMain 函数使用弱外部连接。MFC 库也包含 new、delete 和 DllMain 函数。这些函数要求先连接 MFC 库,而后再连接 CRT 库。而后起也给出了其在非MFC环境下的解决方法..............函数
和MFC环境下的解决方法spa
使用 MFC 库时,务必先连接它们,而后再连接 CRT 库。这能够经过确保项目中的每一个文件都首先包含 Msdev\Mfc\Include\Afx.h 来完成。直接包含 (#include <Afx.h>) 或间接包含 (#include <Stdafx.h>) 均可以。Afx.h 包含文件会经过使用 #pragma comment (lib,"<libname>") 指令来强制采用库的正确顺序。
若是源文件的扩展名为 .c,或者该文件的扩展名为 .cpp 但不使用 MFC,则能够建立一个较小的头文件 (Forcelib.h) 并将其放在模块的顶端。这个新的头文件可确保按照正确的顺序搜索库。
Visual C++ 不包含该头文件。要建立此文件,请按照下列步骤操做:code
打开 Msdev\Mfc\Include\Afx.h。htm
选定 #ifndef _AFX_NOFORCE_LIBS 和 #endif //!_AFX_NOFORCE_LIBS 之间的行。blog
将选定部分复制到 Windows 剪贴板。get
建立一个新文本文件。博客
将剪贴板的内容粘贴到这个新文件中。class
将该文件另存为 Msdev\Mfc\Include\Forcelib.h。扩展
可是,因为师姐部分代码牵扯到Linux,因此,不能用#include "stdafx.h"这么简单粗暴的方法
按照这篇博客,将MFC静态连接改成动态连接,发现完美解决了
即在VS2010的环境下,Project → Propreties → General → Use of MFC 将Use MFC in a Static Library改成 Use MFC in a Shared DLL 就OK了