生活随笔
收集整理的這篇文章主要介紹了
非MFC工程中使用MFC库
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
需求說明
C++工程的類型有很多,從VS(或VC)可以看到常見的有:Win32 Console Application、MFC Application、Win32 Project等。在創建MFC工程時,通過IDE的向導會自動幫我們創建相應的類文件和包含必需的頭文件,但有時候我們需要在非MFC工程中包含MFC的庫。至于為什么會有這個需要,為何不在一開始就創建MFC工程呢?可能有兩種原因:1.在MFC工程會產生很多向導生成的代碼以及資源文件,如基于單文檔的工程會有View,Doc等類,很多時候我們并不需要這些東西,只需要一個空工程就可以了。2.使用第三方框架創建的工程,我們很難更改它的工程屬性(如用Firebreath開發瀏覽器插件,通過腳本文件firebreath會自動幫我們生成VS下的工程)。
常見問題
在非MFC工程中使用MFC的庫就需要包含相應的頭文件,經常會遇到下面這個問題:
fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d]
fatal error C1189: #error : WINDOWS.H already included. MFC apps must not #include
問題分析對于第
1 個問題,很簡單:選中工程名右鍵屬性(Project),在Properties\Configuration Properties\General\Use of MFC中選擇Use MFC
in a Shared DLL 出現上面第
2 個問題主要是因為包含頭文件的順序不對。為什么包含WINDOWS.H的時候會有順序要求,網上有一段傳播的非常廣泛解釋:如果在MFC工程中compile error: c:\program files\microsoft visual studio\vc98\mfc\include\afxv_w32.h(
14 ) : fatal error C1189: 如果編譯器在編譯afxv_w32.h文件之前編譯了windows.h文件,編譯器會報上面的錯誤,因為在afxv_w32.h文件中有下面的一句預編譯報警: 問題在于為什么afxv_w32.h中要有這么一句預編譯處理。看了afxv_w32.h和windows.h文件就有點明白了。 在afxv_w32.h中有下面的預編譯語句:
... ... ... ... 在afxv_w32.h中還有一句: 而在windows.h文件中有下面的預編譯語句:
... ... ... ... 注意到在windows.h的開頭有防止windows.h被重復編譯的預編譯開關: 這樣問題就明白了,雖然我不知道微軟為什么要這么做,但是我知道如果在afxv_w32.h沒有那句預編譯報警,那么如果在編譯afxv_w32.h之前 編譯了windows.h,那么在windows.h中猜想原因可能如上所述,我的解決方法是,將包含有的編譯處理發生在先,這樣,由于在afxv_w32.h中已經包含了windows.h,那么宏_WINDOWS_將被定義,后繼的上面的編譯報警也不會發生了。我覺得這種處理要比將所有的一句話,編譯器必須在編譯windows.h之前編譯afxv_w32.h,因為我不是十分清除什么時候afxv_w32.h會被編譯,所以我將可能包含有參考解決方法解決這個問題的總體思路是:把#include <afxwin.h>的包含語句把到最前面。sunshine1314 的博文《非MFC工程使用MFC庫時的問題及解決辦法》給出了一序列的解決方案,大家可能參考一下,也許能解決你們的問題。但我當時通過這一系列方法還是沒能解決我的問題。
總結
以上是生活随笔 為你收集整理的非MFC工程中使用MFC库 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。