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-22]. (原始内容存档于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. 

外部链接