跳轉到內容

Windows 程式設計/使用 OSS 工具進行 Windows 程式設計

來自 Wikibooks,開放世界中的開放書籍

獲取開源編譯器

[編輯 | 編輯原始碼]

使用高速網際網路連線,gcc——一個可以編譯 C、C++ 和 Fortran 以及其他語言並在 Windows 上執行的免費編譯器——可以透過 Cygwin 獲得。安裝 Cygwin 時,選擇安裝 “devel/gcc” 包,並根據計劃編寫的程式型別選擇是否安裝 “graphics/opengl”。 GCC 編譯器集合的另一個 Windows 移植版本是 MinGW (Minimalist GNU for Windows),大約 10MB 的下載大小,是 Cygwin 大小的 1/10。 您也可以下載 DJGPP,但它更適合於 32 位控制檯程式。 除了透過移植獲得 gcc 編譯器之外,還可以透過在 虛擬化 的 Linux 版本中從命令列編譯,不僅包含 gcc,而且其核心“...是用 GCC 支援的 C 程式語言版本編寫的...”

命令列 GCC 說明

[編輯 | 編輯原始碼]

要進行編譯,請開啟命令列介面並使用以下命令

c:\cygwin\bin\gcc -s -Os -mno-cygwin -o <outputfilename> <inputfilename>

用於命令列程式,以及

c:\cygwin\bin\gcc -s -Os -mwindows -mno-cygwin -o <outputfilename> <inputfilename> -lopengl32 -lwinmm

用於 GUI 程式。

命令列標誌說明

  • -s:透過剝離除錯崩潰應用程式的有用資訊來使輸出程式更小
  • -Os:針對大小進行最佳化(-O3 用於執行速度)
  • -mno-cygwin:使程式無需任何外部非標準 .dll 檔案即可執行
  • -mwindows:將其變成 GUI 應用程式
  • -lopengl32:可選擇使用 OpenGL 進行圖形處理
  • lwinmm:可選擇新增一些多媒體支援,例如聲音、操縱桿和高解析度計時器

為了使用 Cygwin 編譯,必須在 Cygwin 的 bin 目錄中有一個編譯器,而在 Linux 中,gcc 已經別名為可以在所有目錄中使用。

圖形化整合開發環境

[編輯 | 編輯原始碼]

對於更友好的環境,例如 Visual Studio,Bloodshed 的 Dev-C++ 是一個出色的 Windows 開源 IDE。 它擁有一個組織良好的圖形使用者介面,幷包含設定 Windows C/C++ 開發環境所需的一切,預設情況下安裝和使用 GCC 的 Mingw 移植版本(儘管可以將其配置為與其他基於 GCC 的編譯器(如 Cygwin)配合使用)。 它的原始碼(用 Delphi 編寫)可以從 Bloodshed 網站獲得,預編譯的二進位制檔案也可以從該網站獲得。 不過,Dev-C++ 已經很久沒有更新了,並且 Code::BlocksCodeLite 等替代方案已經出現。 Netbeans 是 Sun Microsystems 開發的作為 Java 官方 IDE 的 IDE,但 Netbeans 現在支援多種語言,並且可以透過其外掛系統進行擴充套件。 另一個開源 IDE 是 Eclipse,它最初由 IBM 開發。 另一個專門為 C++ 建立的 IDE 是 Ultimate++

GCC、DJGPP、MinGW 及其他

[編輯 | 編輯原始碼]

這些是三種眾所周知的 FOSS 開發工具集,用於編譯應用程式,儘管它們的功能與 Microsoft 和 Borland 的 Windows 程式設計工具略有不同。

GCC 代表 GNU 編譯器集合。 儘管它提供了對編譯多種程式語言原始碼的支援,但它最常用於 C 和 C++ 程式碼。 因為它是一個編譯器而不是一個 IDE,因此像 DJGPP 這樣的方法會將一些更深奧的細節隱藏在使用者面前,簡化了程式的建立,並提供了其他功能,如下所述。

DJGPP 是 DJ Delorie 自 1989 年以來開發的整合開發環境 (IDE)。 它是一個具有 32 位感知能力的 DOS 應用程式,並允許建立具有 DPMI 支援的軟體。 作為 GCC 和其他 GNU 工具的組合移植版本,它通常用於編寫、編譯和除錯控制檯應用程式。 它可以利用 Allegro 等庫來建立具有圖形的應用程式,其他附加元件可以擴充套件其功能。 它支援跨平臺開發,這意味著您可以在不需要實際的特定目標機器型別或作業系統例項的情況下建立軟體,以便構建要運送到該配置的可執行檔案。

MinGW 代表 Minimalist GNU for Windows,它包含使用 Win32 API 所需的標頭檔案;它支援建立本機 Windows 可執行檔案。 截至 2006 年 12 月下旬,維基百科將 MinGW 的目標定義為“僅提供免費編譯器和工具鏈,優先考慮效能”。 這與 Cygwin 建立 POSIX 相容開發環境的目標形成對比。 與 DJGPP 一樣,它可用於跨平臺開發。 由於 MinGW 可用於 Windows 之外的其他系統(如 Linux),即使沒有 Windows 副本的開發人員也可以建立 Win32 API 應用程式。 此外,可以使用 WINE 程式(它將 Windows API 呼叫轉換為相應的 UNIX 系統函式)來執行 PE 可執行檔案(.exe 檔案),以便了解應用程式的外觀——而無需實際安裝 Windows。

原始的 MinGW 專案(來自 mingw.org)已被分叉,現在有一個 MinGW64 專案。 原始專案僅提供 32 位編譯器。 分叉的專案提供了 32 位和 64 位編譯器。 專案的目標不同。 原始的 MinGW 專案努力僅與公開記錄的 Windows API 配合使用。 MinGW64 專案聲稱他們使用乾淨室技術對缺少的資訊進行了逆向工程,因此使用這些 API 不會侵犯版權。

Dev-C++ 是一個免費的圖形化 IDE,它與 MinGW 一起打包,也可以使用 Cygwin 編譯器。

LLVM 是一個開源的替代編譯器。其目標之一是改程序序最佳化。它可以與其他編譯器套件一起使用,例如微軟的 C/C++ 編譯器或 MinGW64。截至撰寫本文時,它需要單獨的連結器(例如 GNU 編譯器套件透過 MinGW64 提供的連結器)。

如果你只想在 Linux 機器上使用 gcc 進行 Windows 開發(交叉編譯到 Windows),另一個選擇是 midipix 專案。它使用輕量級的 musl C 庫以及 gnu 編譯器套件。他們正在建立 POSIX 相容層,以使用 ntdll 將 musl 移植到 Windows。這避免了需要 Windows C 執行時庫(MinGW 需要它)。該專案已經移植了幾個開源應用程式,並使用它們的 GNU gcc 編譯器版本執行。

其他工具

[編輯 | 編輯原始碼]

GCC、DJGPP 和 MinGW 不支援 Windows 程式設計中常見的圖形化資源和 GUI 編輯。

MinGW 提供 w32api 包,其中包含支援本地 WIN32 API 的標頭檔案和連結到 DLL 的方法。Windows OpenGL 和 DirectX 也可以與 MinGW 一起使用。MinGW 版本的 DirectX 標頭檔案不如官方 Microsoft 標頭檔案完整。

但是,開源庫(如 QT、GTK+、wxWidgets 和 FLTK)提供了使用者介面前端以及簡化的模型,包裝了 Windows API 的複雜性。最小的權衡是,這些可能需要特殊的許可證以及執行時 DLL 的捆綁。

你也可以使用 SDL、Allegro、SFML 等圖形庫來建立使用者介面或繪製圖形。

基於控制檯的文字使用者介面庫,如 PDCurses 和 ncurses,也適用於 Windows。PDCurses 的一個埠具有 SDL 後端,允許開發人員將圖形與文字使用者介面整合。Nano-X 可以在 Windows 上使用 Allegro 或 SDL 後端構建,並且可用於構建一些與 X Windows 相容的應用程式。

上面提到的所有 GUI 和圖形庫都適用於 MinGW。PDCurses、Nano-X、FLTK 和 Allegro 的版本適用於 DJGPP。

Cygwin 是為 Windows 建立的一個環境,模擬了 Unix 行為。它可以從 cygwin.com 獲得,透過一個小的 setup.exe 包,執行時,它會詢問要獲取的功能選擇。建議使用快速網際網路連線,因為 Cygwin 包含許多非平凡的 shell、程式,甚至 GUI。

安裝程式允許使用者下載以下部分,以及其他部分

  • Bash shell
  • 開發工具,包括偵錯程式、gcc 編譯器支援的幾種語言,以及 AWK、SED、YACC 和 Bison 支援
  • 網路工具,如 ssh、lynx 瀏覽器、nmap 等
  • 程式設計師文字編輯器,如 GNU Emacs、nano 和 vi
  • X,這是一個非常難以在 Windows 上免費獲取的環境(除非從原始碼構建)

選擇軟體後,會將其下載並安裝到使用者硬碟根目錄下的資料夾。它不會重新分割槽驅動器,也不需要安裝任何 Unix 系統,也不使用磁碟映像。檔案只是簡單地安裝在 cygwin 資料夾內的 Unix 層次結構中。

要執行 Cygwin,使用者將在“開始”選單程式或桌面快捷方式中找到一個名為 Cygwin Bash Shell 的程式。開啟它後,會開啟一個類似 DOS 的視窗,並顯示一個經典的 bash 提示符。它與 DOS 不一樣,它是彩色編碼的,並且可以與 DOS 互動,因為它知道路徑設定和其他系統變數,所以請注意,你的 Windows 應用程式可能位於你的系統路徑變數中,並且會與資料夾的當前檔名衝突,因為 DOS 隱式地擴充套件了 EXE 副檔名。

目錄資訊

[編輯 | 編輯原始碼]

作為額外說明,如果你需要訪問計算機中的不同驅動器,而不是使用 /mnt/,你需要 cd 到 /cygdrive/ 中才能看到列出的驅動器。然後,檢視 C: 驅動器的根目錄,只需要在命令列中鍵入 cd /cygdrive/c 即可。

Emacs 編輯器資訊

[編輯 | 編輯原始碼]

使用 Emacs 時,預設情況下,退出程式的正常組合鍵不起作用,雖然熟練的使用者可能會找到一個 Emacs 鍵繫結技巧來解決這個問題。因此,當你想要從命令列模式退出編輯器時,你可能會感到厭煩,並掛起程式,以便在命令列中稍後殺死該程序。而不是按下 C-x C-c 來退出 emacs,你必須按下 F10 來獲取選單。在那裡,按下 f 然後按下 e。這會召喚檔案選單,然後是它的退出選項,返回到命令列,並在一些更改的檔案需要提交到磁碟時提示儲存。

在沒有 Cygwin 庫繫結的情況下編譯

[編輯 | 編輯原始碼]

如前一節所述,使用 g++ 編譯需要包含適當的標誌。gcc 通常會將可執行程式碼繫結到 cygwin1.dll 檔案,除非你的 gcc 標誌明確包含 "-mno-cygwin" 作為開關。為了解決這個問題,你可以使用已知的 Unix 選項將此開關和其他所有開關新增到你的 .bashrc 檔案中

在你的 Cygwin 主目錄中,使用任何編輯器開啟 .bashrc 檔案。查詢以“alias”開頭的行。在那裡,你將看到一些經過調整的 shell 命令,以便具有特定的選項。在包含以下內容的行下方

alias l='ls -CF'

你可以新增

alias g++='g++ -mno-cygwin' #do not depend on cygwin1.dll on target system

如果你需要新增更多微調標籤,你可以在 "-mno-cygwin" 開關之後將它們新增到同一行,或者重新定義 g++ 命令的別名,以便 shell 將 g++ 的當前含義疊加到更多標籤中。例如,你可以新增

alias g++='g++ -Wno-deprecated' #silence deprecation talk. 

以防止 g++ 編譯器提醒你使用 <string> 而不是現在已棄用的 <string.h> 標頭檔案。

沒有 root 許可權或 su 切換

[編輯 | 編輯原始碼]

Cygwin 的建立考慮了一些差異。它沒有不同的 root 帳戶,雖然它可能會聲稱檔案歸 Administrator 使用者所有。雖然這可能超出了本書的範圍,但值得說幾句話,你不會輕易地能夠實驗在不同使用者許可權下執行的程式,因為 Cygwin 似乎沒有試圖強制執行帳戶安全性。你可以閱讀 Windows 允許 Cygwin 訪問的作業系統中的任何檔案。

其他細節

[編輯 | 編輯原始碼]

GNU 工具

[編輯 | 編輯原始碼]

本頁的 Windows 程式設計 圖書是一個存根。你可以透過擴充套件它來提供幫助。


下一章

[編輯 | 編輯原始碼]
華夏公益教科書