版權聲明:您好,轉載請留下本人部落格的位址,謝謝 https://blog.csdn.net/hongbochen1223/article/details/50703886
(一):簡介
為了能夠在一個Winelib應用中使用MFC,你需要首先使用Winelib重新編譯MFC。在理論上,你應該為Windows的MFC編寫一個封裝(如何編寫在後面介紹)。但是,在實踐中,對MFC來說,可能不是一個真正的解決方式:
- 數量巨大的API使得編寫封裝的工作量很大
- 進一步說,MFC包含大量的API,這些API在制作封裝的時候處理起來是非常複雜的。
- 即使你編寫了封裝,你也需要去修改MFC的頭檔案以使編譯器不會阻塞他們。
-
在你應用中的很大一部分MFC代碼是以宏的形式展現的。這就意味着為了能夠編譯基于你的應用的MFC程式,需要有更多的頭檔案需要去處理。
這就是為什麼這裡需要專門幫助你來使用Winelib編譯MFC程式。
(二):法律問題
這一小節的目的就是講述一下潛在的法律問題。這個是一定要注意的。
在編譯你的程式期間,你會從若幹個源碼連結你的代碼:你的代碼,Winelib代碼,微軟的MFC代碼和可能引入的其他代碼。是以,你一定要确定遵守所有源碼的協定。你被允許的和不被允許的都會影響你如何編譯并且發行你的程式。舉個例子,如果你在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
這裡有一些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不支援未命名的結構體,但是最新的版本是支援的,這有很大的幫助.下面是值得一下提的一下選項:
- -fms-extensions(幫助擷取更多代碼來編譯)
- -fshort-wchar -DWINE_UNICODE_NATIVE(Unicode支援)
- -DICOM_USE_COM_INTERFACE_ATTRIBUTE(使COM代碼工作)
當你第一次編譯到連結階段的時候,你将會得到很多未定義的符号錯誤.為了糾正這些錯誤,你必須要傳回源碼,然後使用#ifdef來排除更多的代碼直到你到達閉包狀态 .有很多檔案你不需要去編譯.
也許有一天我們将會有一個現成的makefile文