MFC如何使用靜態MFC庫


 

大部分MFC程序都是使用 在共享DLL中使用MFC ,但是VS每一個版本都需要一個 MFC運行庫,實在是有點煩人。

所以我選擇了使用靜態MFC庫,雖然文件會大一些,但是至少不麻煩了。

 

VS這個做的不夠好,默認情況下居然報錯:

VC編譯錯誤:

1>uafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) 已經在 LIBCMT.lib(new.obj) 中定義
1>uafxcw.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) 已經在 LIBCMT.lib(delete.obj) 中定義
1>uafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@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 庫對 newdelete 和 DllMain 函數使用弱外部鏈接。MFC 庫也包含 newdelete 和 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

---恢復內容結束---


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM