(七):處理MFC

(一):簡介


爲了能夠在一個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文

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章