爲了能夠在一個Winelib應用中使用MFC,你需要首先使用Winelib又一次編譯MFC。windows
在理論上,你應該爲Windows的MFC編寫一個封裝(怎樣編寫在後面介紹)。但是,在實踐中,對MFC來講。可能不是一個真正的解決方案:markdown
數量巨大的API使得編寫封裝的工做量很是大閉包
進一步說。MFC包括大量的API。這些API在製做封裝的時候處理起來是很是複雜的。post
即便你編寫了封裝,你也需要去改動MFC的頭文件以使編譯器不會堵塞他們。spa
在你應用中的很是大一部分MFC代碼是以宏的形式展示的。這就意味着爲了能夠編譯基於你的應用的MFC程序,需要有不少其它的頭文件需要去處理。操作系統
這就是爲何這裏需要專門幫助你來使用Winelib編譯MFC程序。設計
這一小節的目的就是講述一下潛在的法律問題。這個是必定要注意的。調試
在編譯你的程序期間,你會從若干個源代碼連接你的代碼:你的代碼,Winelib代碼。微軟的MFC代碼和可能引入的其它代碼。因此,你必定要肯定遵照所有源代碼的協議。code
你被贊成的和不被贊成的都會影響你怎樣編譯並且發行你的程序。開發
舉個樣例,假設你在GPL或者LGPL協議下發行你的代碼,你不能使用MFC。因爲這些代碼不一樣意你作開放。
有一個解決的方法-在你的代碼的協議中。你能夠爲MFC庫作一個除外說明。
Wine/Winelib發行是依照GNU的LGPL協議發行的。
查看協議來獲取一些在源代碼改動和發行方面的限制。大致上,他可能會滿座不論什麼類型程序的限制。
另外一方面,MFC是以一個很是嚴格的協議發行的。當使用MFC的時候,有三個方面你需要知道。
首先,在你的計算機上你必須依法獲取MFC源代碼。MFC源代碼是做爲Visual Studio的一部分發行的。
Visual Studio的許可證書代表他是一個單一的項目。不能被分解成一個個的組件。因此最乾淨的辦法就是購買Visual studio,而後經過Wine或者是在一個雙啓動Linux中安裝他。
而後,你需要檢查你是否被贊成在一個非微軟的操做系統上又一次編譯!這也是隨着MFC的版本號而變化的。如下是在VS6.0中的MFC的部分許可證:
1.1 通用許可證。微軟授予你做爲我的,非排他性許可證來編譯和複製軟件產品用於設計,開發和測試你的與微軟操做系統產品結合的軟件產品的惟一目的。
因此這就意味着你不能使用這個許可證來爲Winelib編譯MFC。幸運的是,VS6.0服務包3許可證,如下所列部分:
1.1 通用許可證。微軟授予你做爲我的,非排他性許可證來編譯和複製軟件產品用於設計。開發和測試你的軟件產品的惟一目的。
因此在這個許可證名下,看上去咱們能夠編譯用於Winelib的MFC。
最後,你必須檢查你是否擁有公佈MFC庫的權利。檢查許可證的」公佈和你的公佈權限」部分。許可證指出,假設沒有調試信息。並且假設你公佈一個向MFC庫中提供重要功能的應用的時候,你惟獨權利公佈MFC庫的二進制版本號。
這裏有一些MFC和Winelib編譯的建議:
咱們推薦在--interactive
模式下執行winemaker來爲MFC和ALT部分指定正確的選項(獲取正確的包括路徑。不要考慮以MFC爲基礎的MFC,將他編譯成庫而不是可執行文件)。
而後,當編譯MFC的時候。你確定需要必定數量的_AFX_NO_XXX
宏。但是這些是不夠的,另外一些其它的事情你需要去作,包括'#ifdef-out'
。舉個樣例,
Wine的richedit庫支持不是很是好。
如下是我使用的一下AFX選項:
#define _AFX_PORTABLE
#define _FORCENAMELESSUNION
#define _AFX_NO_DAO_SUPPORT
#define _AFX_NO_DHTML_SUPPORT
#define _AFX_NO_OLEDB_SUPPORT
#define _AFX_NO_RICHEDIT_SUPPORT
你也需要傳統的CMonikerFile,OleDB,HtmlView等。
咱們建議使用Wine的msvcrt頭(-isystem $(WINE_INCLUDE_ROOT)/msvcrt
),儘管這意味着你必需要臨時禁止winsock的支持(使用#ifdef
,將他排出inwindows.h
).
你應該使用版本號不低於2.95的g++編譯器.g++ 2.95不支持未命名的結構體,但是最新的版本號是支持的,這有很是大的幫助.如下是值得一下提的一下選項:
當你第一次編譯到連接階段的時候,你將會獲得很是多沒有定義的符號錯誤.爲了糾正這些錯誤,你必需要返回源代碼,而後使用#ifdef來排除不少其它的代碼直到你到達閉包狀態 .有很是多文件你不需要去編譯.
或許有一天咱們將會有一個現成的makefile文