環境: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了