在Windows上安裝gcc,gcc官網上推薦我們了兩種方式:
當然,除此之外還有其他的方式,我們先從mingw開始理解。
mingw-64
“GCC for Windows 64 & 32 bits”,也就是說mingw是在Windows下把gcc的源代碼移植windows api,讓我們在Windows上也可以用gcc編譯c代碼,gcc與操作系統的api交互的地方mingw都與Windows API做了兼容處理。
所以說,mingw的gcc編譯出來的c/c++程序是可以原生在Windows上執行的。
注意mingw很多時候只做代碼工作,發布編譯好的gcc.exe會很懶,經常找不到合適的版本,除非自己下載源代碼編譯。
mingw-64是mingw的升級版,后邊說道的mingw,都是指mingw-64。
mignw-64的官網 https://www.mingw-w64.org/
總結一下:mingw的工作是集成gcc源碼與Windows API,用於把gcc移植到Windows上用原生的方式編譯程序。用得到的gcc.exe編譯的程序可以在Windows上原生運行。他們命名方式一般如下:
之所以有這么多,首先是gcc支持各種平台,比如arm上的Windows,再就是交叉編譯,還有一個重要原因是鏈接庫的不同。
比如光c語言的標准庫就有2套,msvcrt
和ucrt
,前者是微軟在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
再總結一下: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不同,mingw一般是只開發代碼,偶爾提供編譯好的gcc.exe打個包發布,而cygwin則更勤快一些,提供了編譯好的exe。
更重點來了:cygwin的軟件包里,還包含了mingw的gcc。也就是說cygwin軟件包里包羅萬象,不只有依賴cygwin1.dll
的gcc還有mingw的gcc(編譯原生Windows程序而不依賴cygwin1.dll)。如下圖所示:
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都可以裝。 - 或者 https://winlibs.com/ 與mingw的工作重心在代碼上不同,這個網站只做編譯包,他會去mingw拿到最新的源碼並編譯出來gcc.exe然后發布出來,版本會比較全。
cygwin的特點:可以手動選gcc版本,比較方便。但是安裝其他軟件只能重新啟動cygwin的setup軟件。另外cygwin更新好像略慢。
msys2的特點:包管理工具pacman很好用,軟件很多。但是想要特定版本的gcc只能用特定的msys2安裝包。
msys2在清華源(https://mirrors.tuna.tsinghua.edu.cn/msys2/)可以找到所有版本的安裝包,也還比較方便。
one more thing
其實一開始mingw也是把自家的所有gcc打包發布的,但是這個setup包發布更新太慢這才出來了mingw-64。mingw-64同樣因為類似的問題才出來了msys2。mingw-64已經很久沒發布gcc的setup包了,都是cygwin或者msys2拿到mingw的代碼編譯一份出來。