MFC学习篇(二):error LNK2005 及其解决方法
环境:MFC条件下添加原有代码
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环境下的解决方法
使用 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++ 不包含该头文件。要创建此文件,请按照下列步骤操作:
打开 Msdev\Mfc\Include\Afx.h。
选定 #ifndef _AFX_NOFORCE_LIBS 和 #endif //!_AFX_NOFORCE_LIBS 之间的行。
将选定部分复制到 Windows 剪贴板。
创建一个新文本文件。
将剪贴板的内容粘贴到这个新文件中。
将该文件另存为 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了