MinGW

适用于Windows的GNU工具链的实现

MinGWMinimalist GNU for Windows),又稱mingw32,是將GCC編譯器和GNU Binutils移植到Win32平台下的產物,包括一系列頭文件(Win32API)、函式庫可執行文件

MinGW
原作者Colin Peters
開發者MinGW Project
首次發布1998年7月1日,​26年前​(1998-07-01
當前版本
  • 11.0.1(2023年4月29日;穩定版本)[1]
編輯維基數據鏈接
操作系統Microsoft Windows
類型編譯器
許可協議公有領域標頭檔),
GPL編譯器工具鏈
網站osdn.net/projects/mingw/ (project page, still active)
mingw.osdn.io (inactive and broken; former domain of mingw.org has expired)

另有可用於產生32位及64位Windows可執行文件的MinGW-w64項目,是從原本MinGW產生的分支[2]。如今已經獨立發展[3]

歷史

MinGW是從Cygwin(1.3.3版)基礎上發展而來。

編程語言支持

GCC支援的語言大多在MinGW也受支援,其中涵蓋CC++Objective-CFortranAda

對於C語言之外的語言,MinGW使用標準的GNU運行時庫,如C++使用GNU libstdc++

但是MinGW使用Windows中的C運行時庫。因此用MinGW開發的程序不需要額外的第三方DLL支持就可以直接在Windows下運行,而且也不一定必須遵從GPL許可證。這同時造成了MinGW開發的程序只能使用Win32API和跨平台的第三方庫,而缺少POSIX支持[4],大多數GNU軟件無法在不修改源代碼的情況下用MinGW編譯。

組件

MinGW支持根據<name>.lib<name>.dll命名的動態庫,以及遵循Unix和類Unix系統中常見的lib<name>.a命名約定的靜態庫。

此外,MinGW的一個被稱為MSYS(最小系統)的組件提供了一個輕量級類Unix shell環境的Windows端口,包括rxvt英語rxvt和一些足以使autoconf腳本運行的POSIX工具[5],但它不提供C編譯器或區分大小寫的文件系統[6]

與Cygwin比較

Cygwin 與 MinGW 皆可用來移植 Unix 軟件到 Windows,但它們採用截然不同的實作。Cygwin 旨在提供一個完整的 POSIX 層,包括主流 Unix 的系統呼叫及函式庫實作;其重視兼容性優先於性能。相對的,MinGW 則着重簡化與性能。因此,它並不提供某些難以用 Windows API 實現的 POSIX API,例如 fork()mmap()ioctl()。使用跨平台函式庫寫成的應用程式,若函式庫本身已移植到了 MinGW(例如 SDLwxWidgetsQtGTK+),則那些應用程式通常也容易用 MinGW 編譯。

用 Cygwin 寫成的 Windows 程序,因為是執行在公共版權的兼容 DLL 上,所以 DLL 必須隨著程序源代碼一起發布。MinGW 則不需要兼容層,因為基於 MinGW 的程序是直接調用 Windows API 編譯的。

MinGW 搭配 MSYS 可以產生一個小卻完整的執行環境,讓程式可以載入隨身裝置當中,而不需要修改註冊表或產生額外檔案。

在 POSIX 系統下,用 MinGW-GCC 交叉編譯 Windows 應用程式也是可行的。這意味著開發者不需要安裝 Windows 與 MSYS 就能編譯 Windows 軟件,或 Windows+Cygwin 軟件。

異常機制

MinGW編譯器在實現異常機制時,有三種可選方式:

  • SJLJ (setjmp/longjmp):可用於32/64位,但不是零代價的:即使不拋出異常,仍會有一定的性能損失(在最差情形下~15%)。
  • DWARF (DW2, dwarf-2):只能用於32位,沒有永久的運行時開銷,需要呼叫堆疊是dwarf-enabled,這意味着異常對於Windows system DLLs或Visual Studio編譯的DLLs的異常不能被拋出。
  • SEH:零開銷。

MinGW-w64

MinGW-w64是2005年由OneVision Software根據淨室設計原則而獨立開發,以解決當時的MinGW項目更新緩慢,缺少新的重要的API以及64位支持。2008年MinGW-w64項目開源,由Kai Tietz維護。

  • SourceForge.net上的MinGW-w64官方的下載站點 提供由MinGW-Builds等項目組製作的預編譯版。編譯器分64位版和32位版、分別包含sjlj、drawf、seh異常處理機制、分別支持POSIX線程模式或Win32線程模式。用戶可根據需要下載不同版本。例如,64位的seh、POSIX線程的最新穩定版本的gcc套件的下載目錄為:Toolchains targetting Win64 → Personal Builds → mingw-builds → 7.3.0 → threads-posix → seh

非官方編譯器集成安裝包

很多非官方組織提供了包含一系列整合工具鏈的MinGW安裝包。其中大部分基於MinGW-w64項目。

參見

參考資料

  1. ^ MinGW-w64 - for 32 and 64 bit Windows mingw-w64. 
  2. ^ History. MinGW-w64 Wiki. [30 May 2013]. (原始內容存檔於2013年8月16日). 
  3. ^ Harmonizing mingwrt / w32api with mingw-w64. MinGW Mailing list. [30 May 2013]. (原始內容存檔於2013-08-16). 
  4. ^ MinGW - Minimalist GNU for Windows. [2024-11-19]. (原始內容存檔於2006-08-28). MinGW, being Minimalist, does not, and never will, attempt to provide a POSIX runtime environment for POSIX application deployment on MS-Windows. 
  5. ^ (wiki:) MSYS. MinGW.org. [2016-02-18]. (原始內容存檔於2016-02-18). 
  6. ^ (wiki:) MSYS. MinGW.org. [2016-02-18]. (原始內容存檔於2016-02-18). A common misunderstanding is MSYS is "UNIX on Windows", MSYS by itself does not contain a compiler or a C library, [...] nor does it provide any UNIX specific functionality like case-sensitive filenames. 

外部連結