2017-03-02 168 views
0

我想爲MFC項目定義_AFX_NO_MFC_CONTROLS_IN_DIALOGS。這個定義應該會大大減少可執行文件的大小。有關更多詳細信息,請參閱https://blogs.msdn.microsoft.com/vcblog/2012/02/06/reducing-the-size-of-statically-linked-mfc-applications-in-vc11/減少MFC應用程序大小

我使用嚮導創建了「Mfc應用程序」。除了我使用「在靜態庫中使用MFC」(這對我來說這是強制性的)之外,我保留了所有默認選項。

此時,項目建立。

然後,我添加了下面一行在StdAfx.h文件: #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS

在這一點上,我得到了一些鏈接錯誤:

1>uafxcwd.lib(afxctrlcontainer2.obj) : error LNK2005: "void __cdecl AfxRegisterMFCCtrlClasses(void)" ([email protected]@YAXXZ) already defined in afxnmcdd.lib(afxctrlcontainer2.obj) 
1>uafxcwd.lib(afxctrlcontainer2.obj) : error LNK2005: "protected: void __thiscall CMFCControlContainer::PreUnsubclassControl(class CWnd *)" ([email protected]@@[email protected]@@Z) already defined in afxnmcdd.lib(afxctrlcontainer2.obj) 
1>uafxcwd.lib(afxctrlcontainer2.obj) : error LNK2005: "public: int __thiscall CMFCControlContainer::SubclassDlgControls(void)" ([email protected]@@QAEHXZ) already defined in afxnmcdd.lib(afxctrlcontainer2.obj) 

但是,如果我走在項目設置並將字符集從Unicode更改爲多字節,一切都很好..任何人都知道發生了什麼? 我需要將這個改變集成到一些大的和舊的MFC項目中,所以我絕對需要保留「使用Unicode字符集」標誌。

+0

爲了安全起見,您應該始終在命令行(['/ D'編譯器開關](https://msdn.microsoft.com/en-us/library/)上傳遞全局標誌(如'_AFX_NO_MFC_CONTROLS_IN_DIALOGS') hhzbb5c8.aspx))。 – IInspectable

+0

是的,我在stdafx.h和預處理器定義中都試過,但沒有更改。 – Michael

+1

確定您沒有編譯過其他文件或庫,可能沒有設置此標誌?所有使用MFC的庫和目標文件都必須使用此開關編譯... – xMRi

回答

2

定義_AFX_NO_MFC_CONTROLS_IN_DIALOGS是不夠的,您必須確保您不使用擴展的MFC類,如CDialogExCWinAppEx(MFC應用程序嚮導默認使用)。將它們替換爲CDialogCWinApp。在那之後,你將會從初始化各種GUI「管理器」實例的代碼中明顯地得到一些編譯器錯誤。只要刪除這段代碼。

使用MFC應用程序嚮導創建新應用程序時,更容易設置「無擴展MFC控件」(僅適用於基於對話框的應用程序)的複選框。然後它將不會生成使用CDialogExCWinAppEx的代碼,我認爲它也會定義_AFX_NO_MFC_CONTROLS_IN_DIALOGS