Windows上的gcc

在Windows上安装gcc,gcc官网上推荐我们了两种方式:
Windows上的gcc
当然,除此之外还有其他的方式,我们先从mingw开始理解。

mingw-64

“GCC for Windows 64 & 32 bits”,也就是说mingw是在Windows下把gcc的源代码编译了个gcc.exe出来,让我们在Windows上也可以用gcc编译c代码,gcc与操作系统的api交互的地方mingw都与Windows API做了兼容处理。
所以说,mingw的gcc编译出来的c/c++程序是可以原生在Windows上执行的。
mingw-64是mingw的升级版,后边说道的mingw,都是指mingw-64。
mignw-64的官网 https://www.mingw-w64.org/

总结一下:mingw做的产品就是一些gcc.exe,用它编译的程序可以在Windows上原生运行。他们命名方式一般如下:

Windows上的gcc
之所以有这么多,首先是gcc支持各种平台,比如arm上的Windows,再就是交叉编译,还有一个重要原因是链接库的不同。
比如光c语言的标准库就有好几套,msvcrtucrt,前者是微软在win10之前做的一个c标准库实现,后者是win10上做的一个c标准库实现。msvcrt对c99支持好像不太好。具体差别可以看这里 https://www.msys2.org/docs/environments/
c++的标准库也有好几个实现,有苹果的libc++还有gnu的libstdc++
这些库与gcc编译器的链接就有不同的组合,于是就有了这么多的gcc版本,举个例子mingw-w64-x86_64-gcc就是gcc msvcrt libstdc++的组合,面向的平台是x86_64
Windows上的gcc

再总结一下:mingw只做编译器的搬运工,各编译如上图所示。

cygwin的gcc

cygwin项目做的是把Windows api适配成linux api,一旦这个工作做完了,原本在linux能跑的程序就可以直接在Windows上跑,这其中就包括gcc。
所以cygwin的核心工作是做一个cygwin1.dll,除此之外他们还做了更多的工作,把很多软件也编译成exe让我们在Windows上开箱即用(gcc也在其中),这些软件的共同点就是:都依赖于cygwin1.dll。

总结一下:cgywin更像是做了一个软件包的集合,这里包含了很多从linux上移植过来的软件,这些软件都需要依赖cygwin的核心组件cygwin1.dll

重点来了:cygwin的软件包里,还包含了mingw的gcc。也就是说cygwin软件包里包罗万象,不只有依赖cygwin1.dll的gcc还有mingw的gcc。如下图所示:
Windows上的gcc

msys2

msys2就复杂的多了,mingw-64只做单体gcc编译器,cygwin则是一个包括mingw-gcc的软件包,而msys2更像是cygwin的加强版,他的优点如下:

  • msys2做了一个msys-2.0.dll,我们完全可以把这玩意想象成cygwin1.dll
  • msys2用包管理pacman,这就比cygwin方便得多。
  • msys2还包含了mingw-64的gcc编译器。
  • msys2包含的软件很多很多。
    在msys2上搜索gcc可以得到如下:
mingw32/mingw-w64-i686-arm-none-eabi-gcc 10.1.0-2 (mingw-w64-i686-arm-none-eabi-toolchain)
    GNU Tools for ARM Embedded Processors - GCC (mingw-w64)
mingw32/mingw-w64-i686-avr-gcc 8.4.0-4 (mingw-w64-i686-avr-toolchain)
    GNU compiler collection for AVR 8-bit and 32-bit microcontrollers (mingw-w64)
mingw32/mingw-w64-i686-gcc 10.3.0-5 (mingw-w64-i686-toolchain)
    GNU Compiler Collection (C,C++,OpenMP) for MinGW-w64
mingw32/mingw-w64-i686-gcc-ada 10.3.0-5 (mingw-w64-i686-toolchain)
    GNU Compiler Collection (Ada) for MinGW-w64
mingw32/mingw-w64-i686-gcc-fortran 10.3.0-5 (mingw-w64-i686-toolchain)
    GNU Compiler Collection (Fortran) for MinGW-w64
mingw32/mingw-w64-i686-gcc-libgfortran 10.3.0-5 (mingw-w64-i686-toolchain)
    GNU Compiler Collection (libgfortran) for MinGW-w64
mingw32/mingw-w64-i686-gcc-libs 10.3.0-5 (mingw-w64-i686-toolchain)
    GNU Compiler Collection (libraries) for MinGW-w64
mingw32/mingw-w64-i686-gcc-objc 10.3.0-5 (mingw-w64-i686-toolchain)
    GNU Compiler Collection (ObjC,Obj-C++) for MinGW-w64
mingw32/mingw-w64-i686-libgccjit 10.3.0-5 (mingw-w64-i686-toolchain)
    GNU Compiler Collection (libgccjit) for MinGW-w64
mingw32/mingw-w64-i686-perl 5.32.1-4
    A highly capable, feature-rich programming language (mingw-w64)
mingw32/mingw-w64-i686-riscv64-unknown-elf-gcc 10.1.0-2 (mingw-w64-i686-riscv64-unknown-elf-toolchain)
    GNU Tools for RISC-V Embedded Processors - GCC (mingw-w64)
mingw64/mingw-w64-x86_64-arm-none-eabi-gcc 10.1.0-2 (mingw-w64-x86_64-arm-none-eabi-toolchain)
    GNU Tools for ARM Embedded Processors - GCC (mingw-w64)
mingw64/mingw-w64-x86_64-avr-gcc 8.4.0-4 (mingw-w64-x86_64-avr-toolchain)
    GNU compiler collection for AVR 8-bit and 32-bit microcontrollers (mingw-w64)
mingw64/mingw-w64-x86_64-gcc 10.3.0-5 (mingw-w64-x86_64-toolchain)
    GNU Compiler Collection (C,C++,OpenMP) for MinGW-w64
mingw64/mingw-w64-x86_64-gcc-ada 10.3.0-5 (mingw-w64-x86_64-toolchain)
    GNU Compiler Collection (Ada) for MinGW-w64
mingw64/mingw-w64-x86_64-gcc-fortran 10.3.0-5 (mingw-w64-x86_64-toolchain)
    GNU Compiler Collection (Fortran) for MinGW-w64
mingw64/mingw-w64-x86_64-gcc-libgfortran 10.3.0-5 (mingw-w64-x86_64-toolchain)
    GNU Compiler Collection (libgfortran) for MinGW-w64
mingw64/mingw-w64-x86_64-gcc-libs 10.3.0-5 (mingw-w64-x86_64-toolchain) [已安装]
    GNU Compiler Collection (libraries) for MinGW-w64
mingw64/mingw-w64-x86_64-gcc-objc 10.3.0-5 (mingw-w64-x86_64-toolchain)
    GNU Compiler Collection (ObjC,Obj-C++) for MinGW-w64
mingw64/mingw-w64-x86_64-libgccjit 10.3.0-5 (mingw-w64-x86_64-toolchain)
    GNU Compiler Collection (libgccjit) for MinGW-w64
mingw64/mingw-w64-x86_64-perl 5.32.1-4
    A highly capable, feature-rich programming language (mingw-w64)
mingw64/mingw-w64-x86_64-riscv64-unknown-elf-gcc 10.1.0-2 (mingw-w64-x86_64-riscv64-unknown-elf-toolchain)
    GNU Tools for RISC-V Embedded Processors - GCC (mingw-w64)
ucrt64/mingw-w64-ucrt-x86_64-gcc 10.3.0-5 (mingw-w64-ucrt-x86_64-toolchain)
    GNU Compiler Collection (C,C++,OpenMP) for MinGW-w64
ucrt64/mingw-w64-ucrt-x86_64-gcc-fortran 10.3.0-5 (mingw-w64-ucrt-x86_64-toolchain)
    GNU Compiler Collection (Fortran) for MinGW-w64
ucrt64/mingw-w64-ucrt-x86_64-gcc-libgfortran 10.3.0-5 (mingw-w64-ucrt-x86_64-toolchain)
    GNU Compiler Collection (libgfortran) for MinGW-w64
ucrt64/mingw-w64-ucrt-x86_64-gcc-libs 10.3.0-5 (mingw-w64-ucrt-x86_64-toolchain)
    GNU Compiler Collection (libraries) for MinGW-w64
ucrt64/mingw-w64-ucrt-x86_64-gcc-objc 10.3.0-5 (mingw-w64-ucrt-x86_64-toolchain)
    GNU Compiler Collection (ObjC,Obj-C++) for MinGW-w64
ucrt64/mingw-w64-ucrt-x86_64-libgccjit 10.3.0-5 (mingw-w64-ucrt-x86_64-toolchain)
    GNU Compiler Collection (libgccjit) for MinGW-w64
ucrt64/mingw-w64-ucrt-x86_64-perl 5.32.1-4
    A highly capable, feature-rich programming language (mingw-w64)
clang64/mingw-w64-clang-x86_64-clang 12.0.1-5 (mingw-w64-clang-x86_64-toolchain)
    C language family frontend for LLVM (mingw-w64)
clang64/mingw-w64-clang-x86_64-libc++ 12.0.1-5 (mingw-w64-clang-x86_64-toolchain)
    C++ Standard Library (mingw-w64)
clang64/mingw-w64-clang-x86_64-perl 5.32.1-4
    A highly capable, feature-rich programming language (mingw-w64)
msys/gcc 10.2.0-1 (msys2-devel) [已安装]
    The GNU Compiler Collection - C and C++ frontends
msys/gcc-fortran 10.2.0-1 (msys2-devel)
    Fortran front-end for GCC
msys/gcc-libs 10.2.0-1 (msys2-devel) [已安装]
    Runtime libraries shipped by GCC
msys/lcov 1.15-1
    front-end for GCC‘s coverage testing tool gcov
msys/mingw-w64-cross-gcc 10.2.0-1 (mingw-w64-cross-toolchain mingw-w64-cross)
    Cross GCC for the MinGW-w64

如何选择

我的环境里是:cygwin和msys2都装了。想用哪个都随便,下面两个需求,cygwin和msys2都可以实现。

  • 想得到win上原生运行的程序,就安装带mingw的gcc,比如mingw64/mingw-w64-x86_64-gcc,不管msys2和cygwin都可以装。
  • 想得到linux兼容性比较高的程序就使用msys/gcc 10.2.0-1 (msys2-devel)这种,同样,不管msys2和cygwin都可以装。

cygwin的特点:可以手动选gcc版本,比较方便。但是安装其他软件只能重新启动cygwin的setup软件。另外cygwin更新好像略慢。
msys2的特点:包管理工具pacman很好用,软件很多。但是想要特定版本的gcc只能用特定的msys2安装包。

one more thing

其实一开始mingw也是把自家的所有gcc打包发布的,但是这个setup包发布更新太慢这才出来了mingw-64。mingw-64同样因为类似的问题才出来了msys2。mingw-64已经很久没发布gcc的setup包了,都是编译好的gcc直接就在cygwin和msys2上架了。

Windows上的gcc

上一篇:* windows 使用tun上网


下一篇:win10免密码登录netplwiz 没有勾取消开机密码选项怎么办