笔者来聊聊MinGW的学习和理解
1、MinGW认识
MinGW:Minimalist GNU for Windows,GNU项目的for windows的迷你版。
MinGW是针对windows,对GNU 编译器进行的原生的移植,为了构建windows可移植程序,导入了相关的库和头文件,包括支持C99的MSVC的运行库,所有的MinGW软件都可以运行在windows的平台上。
MinGW是一个完全开源的编程工具,其适用于MS-Windows的程序开发,不依赖与第三方的第三方运行库,但是其确实依赖于微软的一些操作系统的DLL,一些DLL是相当稳定的,比如 MSCRT这个C运行库。
MinGW提供了链接微软C运行库以及其他特定语言的运行库的可能,但是MinGW,本身是最小的的一个运行环境集合,但是不是一个可以完整提供一个POSIX运行环境的集合,如果想在运行一个POSIX程序,可以考虑cygwin(后面介绍)。
MinGW主要就是为了那些在原生的MS-Windows开发的人员,但是想用使用GNU工具的开发者们,其主要包括:
- 一套GNU编译器的移植,包括C/C++/ADA/Fortan
- windows上面运行的GNU BinUtils,GNU的bin使用工具
- 在windows上面,命令行的安装和使用,
- GNU界面的安装工具,for MinGW
- 基于MinGW,开发了很多交叉编译环境,比如在GNU/Linux平台开发,部署在windows环境。
2、MinGW以及MinGW-64
MinGW的两个版本,前者已经停止更新,后者目前一直更新。MinGW一直以来都有两个版本,多线程模型有两种,
- win32 thread model
- posix thread model
但是上述模型只是底层实现或者链接不同,并不影响用户上面的使用,pthread和win32的Creathread均可以使用。
2.1、MinGW(32)
- 使用MinGW GUI get Set up tool工具去安装,然后包管理器里面选择需要安装的工具链,
- msys工具链也可以在这里安装,
- 安装完成之后,需要设置环境变量,MinGw/bin 目录以及MinGW/msys/1.0/bin,前者是gcc的环境,后者是msys的环境,提供一些类linux的工具,
- 需要添加HOME的环境变量,Unix下面定义了这个,是用户的工作目录,所以这边也需要定义,set HOME=%USERPROFILE %,windows下面USERPROFILE 是用户的目录。
- 如果不添加环境变量,可以使用快捷方式,命令设置环境变量,
set HOME=%USERPROFILE%
path %PATH%;C:\MinGW\bin
%comspec% - msys可以通过msys/1.0目录下面的bat文件启动,需要注意的是,需要再etc/fstab文件设置MinGW的路径,这样就可以使用msys的环境,所以上面也可以不用设置msys的环境变量,通过mout 挂载就可以知道。
- MinGW只能编译32位程序(实际更新速度很慢,gcc编译器版本也停在了4.8),所以大家后面就开始转向64位,即MinGW-64,支持32位和64位程序,默认是64位,而且支持windows的API更好,
- 下面是MinGW的一些环境目录说明。
/* 在window下可以输入如下命令:*/
gcc -posix -E -dM - < nul
/* linux下,命令稍有不同 */
gcc -posix -E -dM - < /dev/null
/* windows平台相关的:当然是在windows平台 */
#define _WIN32 1
#define __WIN32 1
#define __WIN32__ 1
#define WIN32 1/* GNU相关的:*/
#define __GNUC__ 6
#define __GNUC_STDC_INLINE__ 1
#define __GNUC_MINOR__ 3/*x86 x64架构相关的*/
#define __i586 1
#define __i386 1
#define __i586__ 1
#define __i386__ 1
#define i386 1
#define _X86_ 1
2.3 MinGW-64
简单来说就是支持64位的windows程序编译运行,默认生成64位的程序,通过参数可以指定生成其他位数的程序
MinGW-64的宏主要有以下:
/* windows平台相关的:当然是在windows平台 */
#define _WIN64 1
#define __WIN64 1
#define __WIN32__ 1
#define _WIN32 1
#define WIN32 1
#define WIN64 1
#define __WIN32 1
#define __WIN64__ 1/* GNU相关的:*/
#define __GNUC__ 12
#define __GNUC_STDC_INLINE__ 1
#define __GNUC_MINOR__ 2/*x86 x64架构相关的*/
#define __amd64 1
#define __x86_64 1
多说一句,如果是linux平台,x86架构指令,gcc宏有如下:
/*linux x86架构平台*/
#define __linux 1
#define __linux__ 1
#define __gnu_linux__ 1
#define linux 1#define __x86_64 1
#define __x86_64__ 1#define __GNUC__ 8
#define __GNUC_RH_RELEASE__ 5
#define __GNUC_STDC_INLINE__ 1
#define __GNUC_MINOR__ 3
如果是linux平台,arm架构指令,gcc宏有如下:
/*linux arm架构平台*/#define __linux 1
#define __linux__ 1
#define __gnu_linux__ 1
#define linux 1#define __arm__ 1
#define __ARM_FEATURE_SAT 1
#define __ARM_ARCH_ISA_ARM 1
#define __ARMEL__ 1
#define __ARM_ARCH_6__ 1
#define __ARM_ARCH_ISA_THUMB 1
#define __ARM_ARCH 6
#define __ARM_FEATURE_COPROC 15
#define __ARM_EABI__ 1#define __GNUC__ 8
#define __GNUC_STDC_INLINE__ 1
#define __GNUC_MINOR__ 3
3、Msys以及Msys2
Msys,Minimal System,一个Bourne shell解释器,提供了一个替代微软cmd的选择,一个通用的命令行环境,特别用来适用于MinGW,适用于移植很多开源的程序到MS-Winwos平台上面
其是对于cygwin的轻量级的一个fork,其包括了一部分unix的工具,比如ls/rm/cp/cat/vim等。
mys2:第二代msys,
4、Cygwin的认识
5、参考文档
1、Cygwin 和MinGW 的区别与联系是怎样的?
2、ChatGPT
3、linux/windows下获取gcc(mingw)编译器预定义宏的方式
4、POSIX线程与Win32线程