有了 Xmingwin,就可以從 Linux 服務器生成 Windows 程序。本專欄文章提供了設置 Xmingwin 的方法,並概述了之所以這樣做的最重要的幾個理由。 即使是使用 C,我還是在 Linux 主機上進行大量的 Window 開發。本篇服務器診所專欄文章描述了如何將 mingw32-gcc
有了 Xmingwin,就可以從 Linux 服務器生成
Windows 程序。本專欄文章提供了設置 Xmingwin 的方法,並概述了之所以這樣做的最重要的幾個理由。
即使是使用 C,我還是在 Linux 主機上進行大量的 Window 開發。本篇服務器診所專欄文章描述了如何將 mingw32-gcc source.c -o executable.exe 添加到常規的 gcc source.c -o executable 指令系統以及您為什麼要這樣做。
用 UNIX 自動執行操作 2002 年度最受歡迎的服務器診所專欄中有幾篇文章解釋了如何從服務器管理常見的桌面技術,包括 PDF 和 DOC 文件。從某種意義上說,這是包括 WINE、VMware 和 Linux in the Workplace 在內的許多產品和書籍的目標。它們都宣稱有能力從 Linux 主機復制常見的桌面技術。後面的參考資料一節提供了這些備選方案和建議分別最適用在哪裡的參考。
盡管如此,但本專欄會始終從另一個角度討論這樣的主題。本月的要點不是模擬 Windows,而是使用開發源碼工具來自動生成可在 Windows 上使用的產品。Mingwin(也稱為 Mingw、Mingw32 等)是
MINimalist Gnu for WINdows(用於 WINdows 的最低要求的 Gnu)的簡稱,這個描述很適合它。Mingwin 是一個基於 Windows 的開發套件,它大致可以和 Visual C++ 或 Borland 的 Delphi 相比擬。與後兩者不同的是,Mingwin 的區別在於它提供了在 Windows 中類 UNIX 的環境。由於它基於標准 GNU 編譯器 gcc,所以 Mingwin 還支持使用 C++、Fortran 以及其它緊密相關的語言。它沒有提供結構復雜的集成開發環境(IDE),而它們在 Windows 開發環境中是很常見的。但是,Mingwin 擁有豐富的工具箱,其中包含健壯的實用程序,可以執行基本的開發操作:編譯、鏈接等等。盡管所有這些操作具有一般的 UNIX 特征,但它們都很靈活並可編程。
服務器診所為什麼要采用這麼“過時”的方法呢?我經常要使用一些必須在 UNIX、Windows 以及其它 OS 下同等運行的應用程序。它可以提高我的生產率,從而能夠從單一源代碼集生成所有可交付的產品。例如,通過將源代碼保留在 Linux 服務器上並進行自動交叉生成,我排除了“要重新引導嗎?我的各個文件系統兼容嗎?項目結構更改了嗎?……”這整個層面的難題,而這些難題似乎會使某些開發實驗室的開發速度變慢。每位開發人員對我的系統所作的更改,要麼導致為所有平台生產所有可交付的產品,要麼是一個顯式的出錯信息。這個即時反饋防止了“啊,上周我們還以為一切順利”之類的絕大多數意外情況。
如果您也想更多地關注開發進展,而對支持平台花更少的精力,那麼您會喜歡 Xmingwin。我將“Mingwin run as a cross-generating application.(Mingwin 作為一個交叉生成的應用程序運行。)”稱為 Xmingwin。您應該知道:您還會看到它拼寫成“cross Mingw32”、“Xmingw32”或其它變體。在寫本文時未很好地對其用法標准化。請回憶:Mingwin 安裝在 Windows 主機上並提供 UNIX 界面;Xmingwin“取消”了這個界面,以便其操作與 Windows 上的相同,而且它產生的輸出與 Windows 准備的相同,但是是從 UNIX 安裝上產生的。
安裝很簡單。我在這裡之所以強調這一點,是因為當我首次使用 Xmingwin 時,我遇到了正確的、有點混亂的以及完全誤導的各種建議。從簡單步驟開始安裝。要了解基本的基於 x86 的 Linux 信息,以開始您的 Xmingwin 生涯,請使用內容詳盡的包(請參閱參考資料,獲取鏈接)。
對它解壓縮並解包:
清單 1. Xmingwin 包的解包序列
INSTALLATION=/tmp/experiment
cd $INSTALLATION
bunzip2 mingw-cross.tar.bz2
tar xvf mingw-cross.tar
要開始生產性的交叉生成工作,這就足夠了。盡管可能的變體一般有成千上萬種,對於 Linux 開發人員工具而言它們都很標准(根據不同的優化級別進行鏈接、移植到另一種硬件類型的 Linux 等),但是基本的 Xmingwin 安裝會讓您費一番功夫。
將 Xmingwin 用於交叉生成 將分發版的 bin 目錄添加到您的 PATH。有些開發人員喜歡鏈接或符號鏈接的方案,這樣,他們可以在命令提示符下輸入 gcc,並將它解析成完整路徑,例如 /tmp/experiment/bin/mingw32-gcc。我自己的首選是讓 gcc 總是意味著本機編譯器,並按需顯式調用或配置 mingw32-gcc。
對新安裝的第一個
測試應該只是詢問它的版本:mingw32-gcc -v。它很可能報告類似如下信息:
gcc version 2.95.3 20010315 (release)
接著,嘗試規范的“全面測試” — 編寫:
清單 2. 最小的“hello, world”源代碼
#include <s
tdio.h>
int main(int argc, char *argv[])
{
puts("It works!");
}
並用下列命令進行編譯:
清單 3. 簡單源代碼的樣本生成序列
WORKING=/tmp
INSTALLATION=/tmp/experiment
PATH="$PATH:$INSTALLATION/bin"
export PATH=$PATH:$INSTALLATION/bin
cc -o $WORKING/minimal $WORKING/minimal.c
mingw32-gcc -I$INSTALLATION/mingw32/include -o $WORKING/minimal.exe $WORKING/minimal.c
該腳本提供了 Linux 應用程序 /tmp/minimal 及其 Windows 對應者 /tmp/minimal.exe。將後者轉移到便利的 Windows 主機,您會發現它執行時就象任何其它行為良好的 Windows 應用程序。
背景 現在討論正題。Xmingwin/bin 目錄並不只是包含交叉編譯器,它還包含交叉鏈接器、交叉庫管理器以及幾乎兩打用於常見開發人員操作的相關工具。有了一點實踐後,您就可能從已經在使用的同樣的 Makefile 中生成基於 Windows 的可交付產品,就象您目前在對 Linux 所做的那樣簡單。
自 1998 年 Colin Peters 創建第一個 Mingwin 編譯器以來,它發展得相當快。那時,他的 gcc 版本運行在 Cygnus 環境中。隨著 Jan-Jaap van der Heijden 將 Mingwin 作為本機 Windows 應用程序重新托管,並將 Mingwin 擴展成包含所有的 GNU binutil 和 make,這種發展在不斷繼續著;後來,Mumit Khan 擴充了這些成就,使之包含更多 Windows 獨有的東西,包括更佳的 Win32api 聯編。
GUI 和特定於 Win32 的功能是 Mingwin 關注的一個焦點;您可以在後面的參考資料(特別是 Khan 的文章)中閱讀有關這方面的更多信息。服務器診所討論的重點是可以在 Linux 和 Windows 上工作的應用程序。我將自己的開發精力分成大致相同的兩半,一半是可移植的“純 C”,另一半是進行交叉開發的 Critcl。
Critcl 是一種吸引人的 Tcl 編程語言擴展。一開始 Critcl 為 Tcl 完成一些操作,大致相當於 Brian Ingerson 的 Inline 為 Perl 所做的:允許“外部”語言(在本例中是 C,但大體上您可以使用
SQL、匯編程序或甚至范圍更廣的組合)嵌入到主機語言的源代碼中。這提供了許多優點,需要將來用完整的專欄文章來描述這些優點。現在的要點是 Critcl 創建者 Jean-Claude Wippler 已經充分完善了他的創建,從而使交叉生成變得簡單。其結果是:無需編寫 make 文件或確定鏈接參數,單一源代碼庫就足以為主機和交叉環境生成 Tcl 和 C 目標代碼。Critcl 允許我自動執行並完成具有挑戰性的作業,而且其速度比傳統的“手工”方法快得多。
結束語 我有點跑題了:我們會在將來的專欄文章中討論有關 Critcl 的更多問題。在此期間,我感興趣的是 Xmingwin 為您提供的好處是否象我所獲得的那麼多。您的 DLL(大多數情況是特定於 Windows 的動態載入庫)對您而言工作正常嗎?更明確地說,只用高級的由 Linux 托管的語言(諸如 Python、
Ruby、Tcl、Perl、REBOL 等)進行的開發是否按您所願進行呢?您是否曾看到過這樣一個作業:您知道 Linux 服務器要完成這個作業,但是不知道如何做,或甚至不知道使用哪種語言?請參加 Scripting 診所
論壇(單擊本文頂部或底部的討論),分享您的經驗。