MFC學習篇(二):error LNK2005 及其解決方法

環境: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 庫對 newdelete 和 DllMain 函數使用弱外部連接。MFC 庫也包含 newdelete 和 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了

相關文章
相關標籤/搜索