概述
主要是两个派系:mingw和cygwin
简单总结:
cygwin编译得到的程序需要依赖cygwin的dll才能运行。
mingw编译的到得程序在win32下直接可以运行。
原理:
cygwin是做了一层系统api的包装,转换win api成unix api,这些api就在cygwin1.dll中。所以编译器和程序调用不知道自己在unix环境下还是win环境下。
mingw则是修改了编译器,gcc但凡是要去调用unix api的地方都做了转换,去调用win api。所以mingw编译得到的exe可以直接在win环境里运行。
历史演变
主要是mingw:
mingw32(msys) -> mingw64 -> msys2
最早是mingw32,因为不支持64位系统后来出了mingw64,再后来因为更新拖沓,又有一些人fork了mingw64做了更新的msys2.
msys2更像是集成了mingw32、mingw64、cygwin的优点的东西,后边细讲。
cygwin则是并没有这么复杂的演变。
各安装目录
mingw系:
为什么还有git?因为git实际上是一个命令行工具,而为了方便git直接给了我们一个mingw64的环境,里面附带了一些linux下常用的工具。所以这里的git也算mingw64.
mingw32、mingw64的安装目录下,都有个bin文件夹,这里是一些linux里的工具,都是exe结尾。
例如上图的gcc,我们就可以用它来编译c代码,得到的EXE可以直接在Windows任意地方运行。
但是编译器不只有gcc,还有clang等其他,mingw64这里是没有的,而且mingw64安装软件也略麻烦。
msys2刚好解决了上述所有问题,msys2支持这么多:
cygwin:
cygwin最大的特点是完整的linux api封装,基本上在这里能跑的代码,换到linux上直接编译就可以。但是有个问题,那就是任何用cygwin的编译器得到的exe,都要依赖于cygwin1.dll这个文件,因为api的封装就在这里。
单独说下msys2
安装完之后有这么多入口
分别对应的进入不同的编译系列,msys2支持如下这些编译系统
两类软件
终端模拟器
毕竟已经是gui操作系统,在没有gui的时代的那种命令行终端都是gui模拟出来的,powershell ,windows terminal ,mintty,cmder都是终端模拟器。
mingw32、mingw64、cygwin默认用的都是mintty,这个性能还是很好的。
unix shell
是一个命令行解释器,为Unix操作系统和Unix的系统提供传统的用户界面(命令行界面)。 用户通过输入命令行以获取命令行解释器的文本来指导计算机的操作或通过创建一个或多个此类命令的文本脚本。
bash、zsh、sh等都是一些shell,多数linux默认是bash。
一些特性
除了git,mingw和cygwin默认都不是Windows系统全局的环境变量,私有化更安全,毕竟装好几个这样的环境,如果都是全局环境变量,调用gcc的时候怎么确定是你想要的那个。