天天看點

(七):處理MFC

版權聲明:您好,轉載請留下本人部落格的位址,謝謝 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文

繼續閱讀