1.下載
MinGW-w64
WinLibs - GCC+MinGW-w64 compiler for Windows
Releases · niXman/mingw-builds-binaries (github.com)
MinGW-w64、UCRT 和 MSVCRT 是 Windows 平臺上常用的 C/C++ 運行庫,它們有以下不同點:
- MinGW-w64:是一個基于 GCC 的編譯器套件,可以用于編譯 Windows 平臺上的 C/C++ 程序。MinGW-w64 使用的是 POSIX 標準的運行庫,因此可以很好地兼容 Unix/Linux 程序。MinGW-w64 的默認運行庫是 MSVCRT(Microsoft Visual C++ Runtime),但也可以使用其他運行庫。
- UCRT(Universal CRT):是微軟提供的一個通用 C 運行庫,可以用于編譯 Windows 平臺上的 C/C++ 程序。UCRT 提供了許多與標準 C 庫兼容的函數,并支持新的 C11 和 C++11 標準。UCRT 適用于 Windows 10 或更高版本的操作系統。
- MSVCRT(Microsoft Visual C++ Runtime):是微軟提供的一個 C++ 運行庫,可以用于編譯 Windows 平臺上的 C/C++ 程序。MSVCRT 提供了許多與標準 C 庫兼容的函數,但不支持新的 C11 和 C++11 標準。MSVCRT 在 Windows 操作系統中已經內置,并且隨著 Visual Studio 版本的升級而不斷更新。
2.配置環境變量
將 MinGW 的 bin 目錄添加到系統的 PATH 環境變量中,這樣可以在命令行中直接使用 MinGW 的工具。
3.驗證版本
gcc 和 g++ 都是 GNU 工具鏈中的編譯器,它們的主要區別在于它們所編譯的代碼的語言不同。
gcc 是 GNU C 編譯器,它主要用于編譯 C 語言程序,可以將 C 語言源代碼編譯成可執行文件或動態鏈接庫。
g++ 則是 GNU C++ 編譯器,它主要用于編譯 C++ 語言程序,可以將 C++ 語言源代碼編譯成可執行文件或動態鏈接庫。
雖然 gcc 和 g++ 是兩個不同的編譯器,但它們都基于同一套 GNU 工具鏈,并共享許多相同的功能和選項。因此,除了語言不同外,它們的使用方式和命令選項也非常相似。
需要注意的是,C++ 語言相對于 C 語言來說增加了一些特性,例如類、繼承、多態等。如果您想編譯 C++ 代碼,建議使用 g++ 編譯器,因為它可以更好地支持這些特性。而如果您只是編譯 C 代碼,gcc 編譯器就足夠了。
gcc -v
gdb -v
mingw32-make -v
注:要使用make,請把mingw32-make改成make
clang 和 gcc 是兩個不同的 C/C++ 編譯器,而 mingw-w64 是一個 Windows 上的編譯和運行時環境。注意,mingw-w64 本身并不是一個編譯器,而是一組庫、頭文件和實用工具。
gcc 需要 mingw-w64 環境才能在 Windows 上編譯程序,加上最初(現已過時)的 mingw 項目就是專為 gcc 設計的,因此通常用 mingw64 代指 64 位的 gcc 和 mingw-w64 環境。
mingw64、ucrt64、clang64 都是 Windows 原生程序(不依賴 cygwin.dll),不過 mingw64 是很早就有的,后兩者是最近(本回答最初寫于2021年6月)才新加的,~~所以只是選一個用的話就 mingw64 就沒問題。~~(劃掉) 2022年11月25日更新:現在 msys2 官方推薦優先選擇 ucrt64,經過一年多時間,現在 ucrt64 環境已經非常穩定了,而且對 UTF-8 語言環境的支持更好。
后兩者先后剛出來時我還查過,簡而言之,這三者的區別是:mingw64 與 ucrt64 都是用 gcc 編譯器編譯的 Windows 64 位程序,只不過它們鏈接到的 crt(C runtime)不同, mingw64 是鏈接到了 msvcrt ,而 ucrt64 則是鏈接到了 Windows 上新的 ucrt 上。
而 clang64 很好理解,就是用 clang 而非 gcc 來編譯各種庫。另外它也是鏈接到了 ucrt 而非 msvcrt。
三者是共同點是,它們都需要 mingw-w64 環境來進行編譯。
以 zstd 為例:
( /usr/bin/zstd 就是依賴 cygwin 的非原生程序,這里的 msys-2.0.dll 實際上就是 msys2 版的 cygwin.dll )
如果你了解 archlinux 的打包的話(如果不了解可以在 archwiki 了解一下),也可以從這幾個包的打包腳本(PKGBUILD)來觀察區別。msys2 的打包腳本可以在 packages.msys2.org 在線查看。
在這個網站上搜索 zstd 得到這幾個 zstd 包的構建腳本,發現這幾個 Windows 原生的包其實是共用同一個構建腳本的。從 mingw_arch 變量來看,還有幾個32位的包和 arm64 的包也是用這個打包腳本。只不過它會根據不同的 MINGW_PACKAGE_PREFIX 環境變量來執行不同的構建工具、構建出不同的包。
mingw_arch=('mingw32' 'mingw64' 'ucrt64' 'clang64' 'clang32' 'clangarm64')
makedepends=("${MINGW_PACKAGE_PREFIX}-gcc""${MINGW_PACKAGE_PREFIX}-ninja""${MINGW_PACKAGE_PREFIX}-cmake")
這里是 msys2 最初關于添加 ucrt64 與 clang64 構建的討論:issue 6901
changelog:
- 2022-11-25:跟隨上游建議,推薦優先使用 ucrt64
- 2022-06-13:更改措辭,讓表述更加準確
- 2022-01-24:添加了 msys2 官方文檔的鏈接
- 2021-06-07 20:13:init