跨平台编译环境-MinGw
  
   2010-12-22 16:08:11
2010-12-22 16:08:11  阿炯
阿炯
  
  MinGW(Minimalist GNU for Windows),又称Mingw32,是一套以 Gnu gcc/egcs 计划为基础的编译器,其可编译出在 Win32 系统上执行的 ojbect code。是将GNU开发工具移植到Win32平台下的产物,包括一系列头文件(Win32 API)、库和可执行文件,由Colin Peters主导开发并始发于1998年7月。MinGW是从Cygwin(1.3.3版本)基础上发展而来,但是用它所开发的程序不需要额外的第三方DLL支持就可以直接在Windows下运行,而且也不一定必须遵从GPL许可证。另有可用于产生32位及64位Windows可执行文件的MinGW-w64项目,是从原本MinGW产生的分支,如今已经独立发展。
MinGW, a contraction of "Minimalist GNU for Windows", is a minimalist development environment for native Microsoft Windows applications.

MinGW provides a complete Open Source programming tool set which is suitable for the development of native MS-Windows applications, and which do not depend on any 3rd-party C-Runtime DLLs. (It does depend on a number of DLLs provided by Microsoft themselves, as components of the operating system; most notable among these is MSVCRT.DLL, the Microsoft C runtime library. Additionally, threaded applications must ship with a freely distributable thread support DLL, provided as part of MinGW itself).
MinGW compilers provide access to the functionality of the Microsoft C runtime and some language-specific runtimes. MinGW, being Minimalist, does not, and never will, attempt to provide a POSIX runtime environment for POSIX application deployment on MS-Windows. If you want POSIX application deployment on this platform, please consider Cygwin instead.
GCC支持的语言大多在MinGW也受支持,其中涵盖C、C++、Objective-C、Fortran及Ada。对于C语言之外的语言,MinGW使用标准的GNU运行时库,如C++使用GNU libstdc++。但是MinGW使用Windows中的C运行时库。因此用MinGW开发的程序不需要额外的第三方DLL支持就可以直接在Windows下运行,而且也不一定必须遵从GPL许可证。这同时造成了MinGW开发的程序只能使用Win32API和跨平台的第三方库,而缺少POSIX支持,大多数GNU软件无法在不修改源代码的情况下用MinGW编译。
"Mingw32" 是取 Minimalist Gnu-Win32 计划之意,其目标为提供一个可在 Win32 平台上,开发 Win32 native code 的编译器,而非提供 unix 程式移植到 Win32 平台之用,此即为其 minimalist 之意。其使用 Microsoft runtime libraries ,因此由其产生的程序在执行时不需先行安装其他的 DLL。此外其提供 Win32 API 的 header ,故可在程序中调用 Win32 API,并相当程度地兼容于 MS Visual C++ binary,可以使用 VC++ 的 libraries,也支持部份的 COM。
理论上,Mingw32 可使用 Win32 系统上的各式 Software Develope Toolkit,例如 DirectX 便已经证实可行。其提供两种 Microsoft runtime libraries 版本,一是 Ctrdll.dll,另一为 Msvcrt.dll。Ctrdll.dll 存在於所有的 Win32 系统上,甚至在 Windows 3.11/Windows NT 3.5 等 Win32s 系统上亦有,只是很久没有更新了。
Msvcrt.dll 则为较新且持续进行更新与增添功能的 runtime library ,其存在於较新的 Win32 系统上,简单的分辨方式为,如果该电脑上有安装 IE4 或以上的版本时,便有 Msvcrt.dll 。Mingw32 主要以 Ctrdll.dll 为测试目标,故采用 Ctrdll.dll 的版本较稳定。
GCC 就是 MinGW 的核心所在,它是一套支持众多计算机程序语言的编译系统,而且在语言标准的实现上是最接近于标准的。并且 GCC 几乎可以移植到目前所有可用的计算机平台(我的电脑上就还装有 DevKitPro,里面包含 GCC 的 ARM(for GBA/DS/GP32) 和 MIPS(for PSP) 版本。)
MinGW支持根据<name>.lib和<name>.dll命名的动态库,以及遵循Unix和类Unix系统中常见的lib<name>.a命名约定的静态库。此外MinGW的一个被称为MSYS(最小系统)的组件提供了一个轻量级类Unix shell环境的Windows端口,包括rxvt和一些足以使autoconf脚本运行的POSIX工具,但它不提供C编译器或区分大小写的文件系统。
GCC 本身不像 VC 那样拥有 IDE 界面(在 Windows 上也存在 Dev C++ 之类的支持 MinGW 编译器的 IDE)。源代码编辑可以选用任何喜欢的文本编辑器(据说微软的开发人员包括 VC 的开发都不用 VC 所带的 IDE 编辑器,而是选用 VIM 编辑器)。然后使用 make 等工具来进行软件项目的编译、链接、打包乃至发布。而像 cvs(svn) 源代码版本控制工具可以让世界上任何一个角落的人都可以参与到软件项目中来。
用 Cygwin 写成的 Windows 程序,因为是执行在公共著作权的兼容 DLL 上,所以 DLL 必须随着程序源代码一起发布。MinGW 则不需要兼容层,因为基于其的程序是直接调用 Windows API 编译的。MinGW 搭配 MSYS 可以产生一个小却完整的执行环境,让程序可以装入随身设备当中,而不需要修改注册表或产生额外文件。在 POSIX 系统下,用 MinGW-GCC 交叉编译 Windows 应用也是可行的。这意味着开发者不需要安装 Windows 与 MSYS 就能编译 Windows 软件,或 Windows+Cygwin 软件。
MinGW编译器在实现异常机制时,有三种可选方式:
1.SJLJ (setjmp/longjmp):可用于32/64位,但不是零代价的:即使不抛出异常,仍会有一定的性能损失(在最差情形下~15%)。
2.DWARF (DW2, dwarf-2):只能用于32位,没有永久的运行时开销,需要调用堆栈是dwarf-enabled,这意味着异常对于Windows system DLLs或Visual Studio编译的DLLs的异常不能被抛出。
3.SEH:零开销。
Mingw-w64 是头文件,输入库,库与工具的集合,当混成作为编译工具链时(如同 GCC 或 LLVM),提供一套完整的开发环境,(用于)构建原生/native Windows 应用(程序)和库。是原始的 mingw.org 项目的发展产物,其创造以支持 Windows 系统的 GCC 编译器。2007年被分支,以提供 64位支持以及新的 APIs。从那时起它赢得广泛使用与分布。是2005年由OneVision Software根据洁净室设计原则而独立开发,以解决当时的MinGW项目更新缓慢,缺少新的重要的API以及64位支持。2008年MinGW-w64项目开源,由Kai Tietz维护。提供了 32位(x86),64位(x64),以及 ARM64 Windows 之 GCC 与 LLVM 的完全运行时环境。
Mingw-w64 is a collection of header files, import libraries, libraries and tools that, when combined with a compiler toolchain, such as GCC or LLVM, provides a complete development environment for building native Windows applications and libraries. It is an advancement of the original mingw.org project, which was created to support the GCC compiler on Windows systems. It was forked in 2007 in order to provide 64-bit support and newer APIs. It has since then gained wide use and distribution.
(1)MinGW 即“Minimalist GNU for Windows(Windows 的 GNU 系统之最小集/最简集)”。这个名称本身就简洁形象归纳了该运行时环境的本质。其主要目的是为(Unix-like)编译链工具提供 Windows 平台的运行时编译环境。
(2)与官网此处将 mingw-w64 称为“服务编译链工具的完备运行时环境”的定义区别,下文中将提到的 WinLibs(mingw-w64 项目的某个实现),对 MinGW 的理解是(来自 WinLibs 官网):“MinGW-w64 is a free and open source C library for targetting Windows 32-bit and 64-bit platforms.”它将 MinGW-w64 等同于,Windows 平台中的自由/开源的 C 库。这里列举一下它的观点或视角。
常见的两种使用 Windows 下的 mingw-w64 预构建工具链的使用是:
(1)Cygwin 或(更经常使用的)MSYS2, 即支持 POSIX 的框架/运行时环境/编译平台。
(2)WinLibs 的 mingw-w64。
注:POSIX 这里可简单理解为标准化的 Unix shell。
特性区别
拓展介绍 mingw-w64 的特性区别(主要来源于 WinLibs 官网网页):
(1)线程库(threading library)
POSIX:与其他系统兼容得最好(理解:兼容 Unix-like OS),依赖于 libwinpthreads 以 makes libgcc,亦包括 C++11/C11 多线程特性。
WIN32:不含 POSIX threads 的,原生-native Windows thread / pthread.h(理解:已过时,WinLibs 新版本已不再提供)。
MCF:自 GCC13 后提供(自行查阅其他资料理解:windows 平台下的 win32 线程模型,被直接的 win32 api 替代,以支持 C++11 thread 特性实现)。
可见“clang --version”,以及“gcc --version”的信息,较新的 gcc/clang 版本支持 POSIX(线程)。注:也是支持 C++11 多线程特性,因此相较 MCF,可考虑为优先选项。
C:\FreeOA\mingw64-14.2\bin>clang --version
(built by Brecht Sanders, r3) clang version 19.1.7
Target: x86_64-w64-windows-gnu
Thread model: posix
InstalledDir: C:/FreeOA/mingw64-14.2/bin
(2)runtime(UCRT/MSVCRT)
MSVCRT:传统 runtime 库,全部 Windows 版本均有效。
UCRT:Win10 后版本有效(源于 CB help 文档的说法:据说对眼下的 Windows 支持更好)。
对 mingw-w64 环境进行检查(通过 gcc 版本透露的信息):
C:\FreeOA\mingw64-14.2\bin>gcc --version
gcc (MinGW-W64 x86_64-ucrt-posix-seh, built by Brecht Sanders, r3) 14.2.0
Copyright (C) 2024 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
可见在本测试中(win10),安装的 runtime 版本为:ucrt(runtime)。
注1:MSVCRT 适用更早的 Windows,如强调项目一致性,则可选择 MSVCRT(针对全部 Windows 版本)。
注2:Free Software Foundation(Stallman 的“自由软件基金会/FSF”)。
Strawberry Perl v5.36所带的编译器为:
PS D:\> gcc -v
Using built-in specs.
COLLECT_GCC=C:\Strawberry\c\bin\gcc.exe
COLLECT_LTO_WRAPPER=C:/Strawberry/c/bin/../libexec/gcc/x86_64-w64-mingw32/13.1.0/lto-wrapper.exe
OFFLOAD_TARGET_NAMES=nvptx-none
Target: x86_64-w64-mingw32
Configured with: ../configure --prefix=/R/winlibs64_stage/inst_gcc-13.1.0/share/gcc --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32
...
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 13.1.0 (MinGW-W64 x86_64-msvcrt-posix-seh, built by Brecht Sanders)
(3)异常句柄模型(Exception handling methods)
DW2 (DWARF-2) - 需求 DWARF-2 (or DWARF-3) 调试信息,可执行(物的 size)轻微增加(需要在执行物/程序中包含一个比较大的 stack table)。在 Windows 32-bit 中使用。
SJLJ (setjmp/longjmp) - 比 DW2 要慢些,可用于对非 GCC 编译进行交叉工作(未被 WinLibs 选用)。
SEH (Structured Exception Handling/结构化异常句柄) - native(原生) Windows 异常句柄机制,但 Windows 32-bit 平台中 GCC 编译器不支持。在 Windows 64-bit 中使用。
(4)Windows 平台
尽管很少工作在 32bit Windows 平台,这里仍然对下列特性说明:
Win32:i686;Win64:x86_64
此外,WinLibs 自述它是一个“ecosystem ”(生态系统),且无需安装。因此它既不需要管理者权限,也不修改 Windows 系统(不改注册表,不设置系统 PATH)。多个版本可以并存某上级目录,移除(remove)仅需删除文件夹。
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项目。
最新版本:2.1
官方主页:http://www.mingw.org/
 
 
	MinGW, a contraction of "Minimalist GNU for Windows", is a minimalist development environment for native Microsoft Windows applications.
MinGW provides a complete Open Source programming tool set which is suitable for the development of native MS-Windows applications, and which do not depend on any 3rd-party C-Runtime DLLs. (It does depend on a number of DLLs provided by Microsoft themselves, as components of the operating system; most notable among these is MSVCRT.DLL, the Microsoft C runtime library. Additionally, threaded applications must ship with a freely distributable thread support DLL, provided as part of MinGW itself).
MinGW compilers provide access to the functionality of the Microsoft C runtime and some language-specific runtimes. MinGW, being Minimalist, does not, and never will, attempt to provide a POSIX runtime environment for POSIX application deployment on MS-Windows. If you want POSIX application deployment on this platform, please consider Cygwin instead.
GCC支持的语言大多在MinGW也受支持,其中涵盖C、C++、Objective-C、Fortran及Ada。对于C语言之外的语言,MinGW使用标准的GNU运行时库,如C++使用GNU libstdc++。但是MinGW使用Windows中的C运行时库。因此用MinGW开发的程序不需要额外的第三方DLL支持就可以直接在Windows下运行,而且也不一定必须遵从GPL许可证。这同时造成了MinGW开发的程序只能使用Win32API和跨平台的第三方库,而缺少POSIX支持,大多数GNU软件无法在不修改源代码的情况下用MinGW编译。
"Mingw32" 是取 Minimalist Gnu-Win32 计划之意,其目标为提供一个可在 Win32 平台上,开发 Win32 native code 的编译器,而非提供 unix 程式移植到 Win32 平台之用,此即为其 minimalist 之意。其使用 Microsoft runtime libraries ,因此由其产生的程序在执行时不需先行安装其他的 DLL。此外其提供 Win32 API 的 header ,故可在程序中调用 Win32 API,并相当程度地兼容于 MS Visual C++ binary,可以使用 VC++ 的 libraries,也支持部份的 COM。
理论上,Mingw32 可使用 Win32 系统上的各式 Software Develope Toolkit,例如 DirectX 便已经证实可行。其提供两种 Microsoft runtime libraries 版本,一是 Ctrdll.dll,另一为 Msvcrt.dll。Ctrdll.dll 存在於所有的 Win32 系统上,甚至在 Windows 3.11/Windows NT 3.5 等 Win32s 系统上亦有,只是很久没有更新了。
Msvcrt.dll 则为较新且持续进行更新与增添功能的 runtime library ,其存在於较新的 Win32 系统上,简单的分辨方式为,如果该电脑上有安装 IE4 或以上的版本时,便有 Msvcrt.dll 。Mingw32 主要以 Ctrdll.dll 为测试目标,故采用 Ctrdll.dll 的版本较稳定。
GCC 就是 MinGW 的核心所在,它是一套支持众多计算机程序语言的编译系统,而且在语言标准的实现上是最接近于标准的。并且 GCC 几乎可以移植到目前所有可用的计算机平台(我的电脑上就还装有 DevKitPro,里面包含 GCC 的 ARM(for GBA/DS/GP32) 和 MIPS(for PSP) 版本。)
MinGW支持根据<name>.lib和<name>.dll命名的动态库,以及遵循Unix和类Unix系统中常见的lib<name>.a命名约定的静态库。此外MinGW的一个被称为MSYS(最小系统)的组件提供了一个轻量级类Unix shell环境的Windows端口,包括rxvt和一些足以使autoconf脚本运行的POSIX工具,但它不提供C编译器或区分大小写的文件系统。
GCC 本身不像 VC 那样拥有 IDE 界面(在 Windows 上也存在 Dev C++ 之类的支持 MinGW 编译器的 IDE)。源代码编辑可以选用任何喜欢的文本编辑器(据说微软的开发人员包括 VC 的开发都不用 VC 所带的 IDE 编辑器,而是选用 VIM 编辑器)。然后使用 make 等工具来进行软件项目的编译、链接、打包乃至发布。而像 cvs(svn) 源代码版本控制工具可以让世界上任何一个角落的人都可以参与到软件项目中来。
用 Cygwin 写成的 Windows 程序,因为是执行在公共著作权的兼容 DLL 上,所以 DLL 必须随着程序源代码一起发布。MinGW 则不需要兼容层,因为基于其的程序是直接调用 Windows API 编译的。MinGW 搭配 MSYS 可以产生一个小却完整的执行环境,让程序可以装入随身设备当中,而不需要修改注册表或产生额外文件。在 POSIX 系统下,用 MinGW-GCC 交叉编译 Windows 应用也是可行的。这意味着开发者不需要安装 Windows 与 MSYS 就能编译 Windows 软件,或 Windows+Cygwin 软件。
MinGW编译器在实现异常机制时,有三种可选方式:
1.SJLJ (setjmp/longjmp):可用于32/64位,但不是零代价的:即使不抛出异常,仍会有一定的性能损失(在最差情形下~15%)。
2.DWARF (DW2, dwarf-2):只能用于32位,没有永久的运行时开销,需要调用堆栈是dwarf-enabled,这意味着异常对于Windows system DLLs或Visual Studio编译的DLLs的异常不能被抛出。
3.SEH:零开销。
Mingw-w64 是头文件,输入库,库与工具的集合,当混成作为编译工具链时(如同 GCC 或 LLVM),提供一套完整的开发环境,(用于)构建原生/native Windows 应用(程序)和库。是原始的 mingw.org 项目的发展产物,其创造以支持 Windows 系统的 GCC 编译器。2007年被分支,以提供 64位支持以及新的 APIs。从那时起它赢得广泛使用与分布。是2005年由OneVision Software根据洁净室设计原则而独立开发,以解决当时的MinGW项目更新缓慢,缺少新的重要的API以及64位支持。2008年MinGW-w64项目开源,由Kai Tietz维护。提供了 32位(x86),64位(x64),以及 ARM64 Windows 之 GCC 与 LLVM 的完全运行时环境。
Mingw-w64 is a collection of header files, import libraries, libraries and tools that, when combined with a compiler toolchain, such as GCC or LLVM, provides a complete development environment for building native Windows applications and libraries. It is an advancement of the original mingw.org project, which was created to support the GCC compiler on Windows systems. It was forked in 2007 in order to provide 64-bit support and newer APIs. It has since then gained wide use and distribution.
(1)MinGW 即“Minimalist GNU for Windows(Windows 的 GNU 系统之最小集/最简集)”。这个名称本身就简洁形象归纳了该运行时环境的本质。其主要目的是为(Unix-like)编译链工具提供 Windows 平台的运行时编译环境。
(2)与官网此处将 mingw-w64 称为“服务编译链工具的完备运行时环境”的定义区别,下文中将提到的 WinLibs(mingw-w64 项目的某个实现),对 MinGW 的理解是(来自 WinLibs 官网):“MinGW-w64 is a free and open source C library for targetting Windows 32-bit and 64-bit platforms.”它将 MinGW-w64 等同于,Windows 平台中的自由/开源的 C 库。这里列举一下它的观点或视角。
常见的两种使用 Windows 下的 mingw-w64 预构建工具链的使用是:
(1)Cygwin 或(更经常使用的)MSYS2, 即支持 POSIX 的框架/运行时环境/编译平台。
(2)WinLibs 的 mingw-w64。
注:POSIX 这里可简单理解为标准化的 Unix shell。
特性区别
拓展介绍 mingw-w64 的特性区别(主要来源于 WinLibs 官网网页):
(1)线程库(threading library)
POSIX:与其他系统兼容得最好(理解:兼容 Unix-like OS),依赖于 libwinpthreads 以 makes libgcc,亦包括 C++11/C11 多线程特性。
WIN32:不含 POSIX threads 的,原生-native Windows thread / pthread.h(理解:已过时,WinLibs 新版本已不再提供)。
MCF:自 GCC13 后提供(自行查阅其他资料理解:windows 平台下的 win32 线程模型,被直接的 win32 api 替代,以支持 C++11 thread 特性实现)。
可见“clang --version”,以及“gcc --version”的信息,较新的 gcc/clang 版本支持 POSIX(线程)。注:也是支持 C++11 多线程特性,因此相较 MCF,可考虑为优先选项。
C:\FreeOA\mingw64-14.2\bin>clang --version
(built by Brecht Sanders, r3) clang version 19.1.7
Target: x86_64-w64-windows-gnu
Thread model: posix
InstalledDir: C:/FreeOA/mingw64-14.2/bin
(2)runtime(UCRT/MSVCRT)
MSVCRT:传统 runtime 库,全部 Windows 版本均有效。
UCRT:Win10 后版本有效(源于 CB help 文档的说法:据说对眼下的 Windows 支持更好)。
对 mingw-w64 环境进行检查(通过 gcc 版本透露的信息):
C:\FreeOA\mingw64-14.2\bin>gcc --version
gcc (MinGW-W64 x86_64-ucrt-posix-seh, built by Brecht Sanders, r3) 14.2.0
Copyright (C) 2024 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
可见在本测试中(win10),安装的 runtime 版本为:ucrt(runtime)。
注1:MSVCRT 适用更早的 Windows,如强调项目一致性,则可选择 MSVCRT(针对全部 Windows 版本)。
注2:Free Software Foundation(Stallman 的“自由软件基金会/FSF”)。
Strawberry Perl v5.36所带的编译器为:
PS D:\> gcc -v
Using built-in specs.
COLLECT_GCC=C:\Strawberry\c\bin\gcc.exe
COLLECT_LTO_WRAPPER=C:/Strawberry/c/bin/../libexec/gcc/x86_64-w64-mingw32/13.1.0/lto-wrapper.exe
OFFLOAD_TARGET_NAMES=nvptx-none
Target: x86_64-w64-mingw32
Configured with: ../configure --prefix=/R/winlibs64_stage/inst_gcc-13.1.0/share/gcc --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32
...
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 13.1.0 (MinGW-W64 x86_64-msvcrt-posix-seh, built by Brecht Sanders)
(3)异常句柄模型(Exception handling methods)
DW2 (DWARF-2) - 需求 DWARF-2 (or DWARF-3) 调试信息,可执行(物的 size)轻微增加(需要在执行物/程序中包含一个比较大的 stack table)。在 Windows 32-bit 中使用。
SJLJ (setjmp/longjmp) - 比 DW2 要慢些,可用于对非 GCC 编译进行交叉工作(未被 WinLibs 选用)。
SEH (Structured Exception Handling/结构化异常句柄) - native(原生) Windows 异常句柄机制,但 Windows 32-bit 平台中 GCC 编译器不支持。在 Windows 64-bit 中使用。
(4)Windows 平台
尽管很少工作在 32bit Windows 平台,这里仍然对下列特性说明:
Win32:i686;Win64:x86_64
此外,WinLibs 自述它是一个“ecosystem ”(生态系统),且无需安装。因此它既不需要管理者权限,也不修改 Windows 系统(不改注册表,不设置系统 PATH)。多个版本可以并存某上级目录,移除(remove)仅需删除文件夹。
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项目。
最新版本:2.1
官方主页:http://www.mingw.org/
