大部分MFC程式都是使用 在共享DLL中使用MFC ,但是VS每一個版本都需要一個 MFC運作庫,實在是有點煩人。
是以我選擇了使用靜态MFC庫,雖然檔案會大一些,但是至少不麻煩了。
VS這個做的不夠好,預設情況下居然報錯:
VC編譯錯誤:
1>uafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@[email protected]) 已經在 LIBCMT.lib(new.obj) 中定義
1>uafxcw.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@[email protected]) 已經在 LIBCMT.lib(delete.obj) 中定義
1>uafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??[email protected]@Z) 已經在 LIBCMT.lib(new2.obj) 中定義
1>../bin/TLLogger_Unicode_Release.exe : fatal error LNK1169: 找到一個或多個多重定義的符号
網上搜尋後,發現,都沒有明顯的說明一個問題,那就是MFC是unicode還是muiltibytes。總之 VS隐藏了許多細節,但我們要了解這些細節,才能解決問題!
在此我做一個完整的補充:
首先确定兩個庫:前一個是 mfc的靜态庫,後一個是 C的靜态庫
Unicode Debug
===========
uafxcwD.lib;libcmtD.lib;
Unicode Release
===========
uafxcw.lib;libcmt.lib;
MultiBytes Debug
===========
nafxcwD.lib;libcmtD.lib;
MultiBytes Release
===========
nafxcw.lib;libcmt.lib;
然後解決方案是:
(分三步)
一、首先配置MFC的使用為在靜态庫中使用MFC:
屬性->正常->MFC的使用,選擇“在靜态庫中使用 MFC”
二、然後,配置運作庫:
屬性->C/C++->代碼生成->運作庫,選擇“多線程(/MT)”
三、最後,在附加依賴項中加入nafxcw.lib和libcmt.lib兩個庫檔案:(注意:庫nafxcw.lib必須先于庫libcmt.lib,前者為mfc靜态連結庫,後者為c運作時庫)
屬性->連結器->輸入->附加依賴項,添加nafxcw.lib和libcmt.lib
解決方法:
http://blog.vckbase.com/zaboli/archive/2010/02/05/40921.aspx
原因:
CRT 庫對 new、delete 和 DllMain 函數使用弱外部連結。MFC 庫也包含 new、delete 和 DllMain 函數。這些函數要求先連結 MFC 庫,然後再連結 CRT 庫。
當 C 運作時 (CRT) 庫和 Microsoft 基礎類 (MFC) 庫的連結順序有誤時,可能會出現以下 LNK2005 錯誤。
解決方法:
強制連結器按照正确的順序連結庫!
project->properties->Linker->Ignore Specific Library 添加 uafxcwd.lib Libcmtd.lib (輸入- 忽略特定庫)
在Additional Dependencied添加uafxcwd.lib Libcmtd.lib (輸入- 附加選項 )
參考連結:
http://blog.csdn.net/lejun2011/article/details/8115463
http://blog.csdn.net/liucanrui/article/details/6453986
---恢複内容結束---