简介:MinGW 64位最新版离线安装包内含GCC 13.1.0完整工具链,面向Windows平台C/C++开发者,尤其适合无法便捷联网下载、需要一键部署编译环境的用户。压缩包共18725个文件,包含大量C/C++头文件(h/hpp)、静态库与动态库(a/lib/dll)、编译器及链接器等可执行程序(exe),同时提供Python辅助脚本(py/pyc/pyd)和HTML文档,可满足编译、调试及二次开发等多样化需求;包体采用7z格式,仅68.89MB。该版本基于POSIX线程模型、SEH结构化异常处理及UCRT通用运行时,解压后即为标准MinGW目录布局(bin、lib、include等),无需网络即可配置环境,并能快速嵌入常见IDE工作流。目前已有1642人学习下载。使用这一离线包,开发者可以直接获得GCC 13.1.0带来的最新语言特性和优化支持,快速搭建原生64位Windows开发环境,顺利推进跨平台或本地应用开发;同时,完整目录结构也为研究GNU工具链、理解编译流程提供了理想的参考样例。
1. MinGW 64位离线安装包:被 MSVC 卡住时我换成了这条工具链
如果你在 Windows 上搞 C/C++,大概率经历过这种时刻:Visual Studio 的安装器卡在网络请求上转圈,CMake 提示找不到编译器,内网机器又没法在线拉 MinGW。这个x86-64-13.1.0-release-posix-seh-ucrt-rt-v11-r离线安装包,就是拿来解决这种尴尬的——它把 MinGW-w64 对 GCC 13.1.0 的完整构建打包好,解压即用,不依赖安装器,也不要求管理员权限。64 位、POSIX 线程模型、SEH 异常处理、UCRT 运行时,这四个参数决定了它跟现代 Windows 开发环境的兼容度。适合三类人:内网或弱网环境下做 C/C++ 开发、用 CMake 但不想碰 MSVC、以及希望在 VSCode/Code::Blocks 里有一条干净gcc命令链的从业者。它不是什么玄学神器,但确实能省掉一晚上的下载和配置时间。
2. 版本命名不是玄学:把 13.1.0 / posix / seh / ucrt / rt-v11 一次讲清
2.1 x86-64 与 MinGW-w64 的位置关系
MinGW 最初是面向 32 位 Windows 的 GCC 移植项目,后来社区分裂出 MinGW-w64,支持生成 64 位程序,现在你看到的绝大多数“MinGW 下载”其实都是 MinGW-w64 的产物。标题里的x86-64明确告诉我们:这是 64 位目标平台,不能用它编出 32 位 exe(想编 32 位得去下 i686 版本)。
13.1.0是 GCC 编译器的版本号。GCC 13 对应完整的 C++20 支持,std::ranges、std::format这类特性都能直接用。如果你项目里有依赖老语法或老 ABI 的第三方库,装完先用gcc --version确认版本,避免拿新版编译器去编译只适配 GCC 9 以下的代码。
这串名字的解析规则是:编译器版本-发布类型-线程模型-异常处理-运行时库-runtime 版本。后面几个参数才是真正决定“这个包能不能在你的项目里跑”的关键。
2.2 posix vs win32 线程模型:多线程代码翻车的高发区
线程模型影响的是std::thread、std::async、OpenMP 这类并发设施能否正常工作。MinGW-w64 提供两个分支:win32和posix。
| 对比项 | posix | win32 |
|---|---|---|
| pthread API | 自带 winpthreads 实现 | 不提供 |
| C++11 std::thread | 支持良好 | 部分版本编译报错 |
| 第三方库依赖 pthread | 可直接链接 | 常需手工适配 |
| 体积 | 略大 | 略小 |
posix版本里内置了 winpthreads,本质是把 Windows 的线程 API 包装成 POSIX 接口。大多数开源库在 Windows 上的预编译包,比如 libcurl、boost 的一些组件,都默认按 pthread 方式链接。我一般无脑选 posix:多花几 MB 磁盘,省掉一堆 “undefined reference to pthread_create” 的排查时间。
2.3 seh vs dwarf vs sjlj:64 位下异常处理的唯一正解
异常处理模型解决的是try/catch在底层如何展开调用栈。32 位 MinGW 通常有dwarf、sjlj、seh三种选择,64 位平台则基本只提供seh。
seh是 Windows 的结构化异常处理,AMD64 的 ABI 强制要求使用它,所以 x86-64 构建里选 seh 是唯一合理选项。dwarf是 GCC 在 32 位 Linux 上的经典方案,到 64 位 Windows 上直接不可用;sjlj是兼容性最广但性能最差的方案,主要在 32 位老场景里兜底。看到posix-seh组合,说明这个包在现代 Windows 上的异常处理和线程行为都接近原生,不用再为跨平台异常机制担忧。
2.4 ucrt vs msvcrt:运行时库决定你的 exe 能在哪些系统跑
ucrt指 Universal C Runtime,是微软在 VS2015 之后重构的 C 运行时,Windows 10/11 系统自带,Win7 上需要系统更新补丁。msvcrt是远古的 Visual C++ 运行时,很多老闭源库依赖它。
选ucrt的实际收益在于:它能与 MSVC 2015 以后编译出的.lib文件进行 ABI 互操作。你在 Windows 上做开发,迟早会遇到“MinGW 项目要用某个 MSVC 编译的第三方库”的情况,比如 Qt 的某些商业插件。运行时统一成 UCRT 后,链接冲突会少很多。msvcrt 和 mingw 混用导致的诡异崩溃,往往就出在两边拿不同版本的 CRT 各自管理堆内存。
2.5 rt-v11 与离线包:为什么比在线安装器省心
rt-v11是 MinGW-w64 runtime 的第 11 版修订,对应一批头文件和导入库的更新。release 版本相对更稳定,不是 nightly 构建。
官网下载点通常在 SourceForge 和镜像站之间跳转,网络差时挂一晚上都不一定跑完;离线安装包的好处是拿 U 盘拷一次,以后每台机器都能用。安装目录的规划我放在下一章,先把命名吃透,后面配置环境变量时你就知道每个参数对应什么了。
3. 五步落地:解压、Path、验证、编译第一个程序
3.1 离线包的解压与目录规划
这个离线包通常是.7z或.zip压缩格式,解压后得到一个mingw64文件夹。关键是别把它解压到C:\Program Files——路径里的空格会影响一部分老 Makefile 的解析,也别放桌面,容易被误删。我习惯统一放D:\dev\或C:\dev\这类无空格路径。
# 示例:把离线包解压到 D:\dev C:\> 7z x x86-64-13.1.0-release-posix-seh-ucrt-rt-v11-r.7z -oD:\dev-oD:\dev是 7-Zip 的输出目录参数,注意-o后面不能有空格。解压完成后确认D:\dev\mingw64\bin目录下能看到gcc.exe、g++.exe、gdb.exe。
3.2 配置环境变量:GUI 与 PowerShell 两种方式
要让命令行能直接调用gcc,需要把mingw64\bin加进Path。图形界面做法是:此电脑 → 属性 → 高级系统设置 → 环境变量 → 在用户变量或系统变量的 Path 中新建一行,填入D:\dev\mingw64\bin。建议直接加在系统变量里,因为有些工具(比如通过服务启动的构建进程)不读用户变量。
命令行方式我推荐用 PowerShell,而不是setx:
# 追加到当前用户的 Path(PowerShell) [Environment]::SetEnvironmentVariable("Path", $env:Path + ";D:\dev\mingw64\bin", "User")这里用[Environment]::SetEnvironmentVariable可以精确控制是写用户级(User)还是系统级(Machine),并且不会像setx那样把整个 Path 读出来覆盖回去导致截断。用setx踩过坑的人应该明白——它会把变量长度截到 1024 字符,改完直接把你原来的 Path 后半段吃掉,属于典型的后悔药都没得吃。
提示:加完环境变量后,必须重开终端窗口,已经打开的 cmd/PowerShell 不会刷新 Path。
3.3 验证工具链:确认版本和实际调用路径
配置完环境变量,先做基础验证,确认系统调用的确实是这个新装的 GCC:
gcc --version g++ --version gdb --version where gccgcc --version第一行会显示类似gcc (MinGW-W64 x86_64-ucrt-posix-seh) 13.1.0的信息。where gcc在 Windows 上会列出所有匹配的 gcc.exe 路径,排在最上面的就是实际调用的那个。如果显示的还是旧版路径,说明 Path 顺序有问题或终端没刷新,后面第 5 章有专门排查。
3.4 编译并运行第一个程序
新建一个hello.cpp,写入一个最简单的入口函数,然后按下面流程编译:
#include <iostream> int main() { std::cout << "hello mingw" << std::endl; return 0; }# 编译,开启常见警告并指定 C++17 标准 g++ hello.cpp -o hello.exe -Wall -Wextra -std=c++17 # 运行 .\hello.exe-Wall -Wextra打开基础警告集,-std=c++17指定语言标准,-o hello.exe指定输出文件名。如果这步能顺利输出hello mingw,说明编译器、链接器、运行时库全部正常。这一步的意义是冒烟测试:大多数环境问题都在这里暴露,比如缺libstdc++-6.dll、Path 没配对、权限不足写不了输出文件。
4. 对接 CMake 与编辑器:把工具链真正用起来
4.1 CMake + MinGW Makefiles:生成器必须显式指定
CMake 在 Windows 上默认去找 Visual Studio 生成器,装了 MinGW 却不知道用,是新手最常遇到的问题。关键是生成器类型要写MinGW Makefiles,同时显式指定编译器:
# 在项目根目录执行 cmake -S . -B build -G "MinGW Makefiles" -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ cmake --build build-G "MinGW Makefiles"让 CMake 生成基于 make 的构建脚本,-DCMAKE_C_COMPILER=gcc和-DCMAKE_CXX_COMPILER=g++直接锁定编译器,避免 CMake 去检测 MSVC。--build build等价于进入 build 目录执行 make,生成的 exe 也在 build 目录里。我一般建议把整条 cmake 命令写进项目的构建脚本里,作为固定流程执行,而不是靠 IDE 自动探测。
4.2 VSCode 里配置 tasks.json:一键编译当前文件
VSCode 本身不带编译器,它只是调用终端里的 g++。最简配置是在项目根目录建一个.vscode/tasks.json:
{ "version": "2.0.0", "tasks": [ { "label": "build with g++", "type": "shell", "command": "g++", "args": ["-g", "main.cpp", "-o", "main.exe", "-std=c++17"], "group": { "kind": "build", "isDefault": true } } ] }-g生成调试信息,给后续断点用;args数组里每一项对应一个命令行参数,注意逗号分隔,不要把整条命令字符串写进去。配置好后按Ctrl+Shift+B就能直接编译。调试还需要在launch.json里配"miDebuggerPath": "D:/dev/mingw64/bin/gdb.exe",这里不展开。
4.3 链接第三方库:.a 和 .lib 的兼容边界
这是 mingw 与 msvc 区别最明显的环节。MinGW 的静态库是.a或直接.dll,MSVC 的静态库是.lib。如果第三方只提供了 MSVC 编译的.lib,直接-lfoo大概率报 “file format not recognized”。常见有三种处理:
- 找该库的 MinGW 预编译包(多数知名库都提供);
- 用
-Wl,--out-implib配合 DLL 生成导入库; - 如果是 CMake 项目,用
find_library指定.a文件路径。
ucrt运行时在这里能缓解一部分问题:MSVC 2015 以后编译出的一些.lib在 ABI 层面可与 MinGW 链接,但仅限于 C 接口,C++ 接口因为名字修饰不同基本无解。原则很简单:能用 C 接口就用 C 接口,不能就换 MinGW 版预编译包,别硬闯。
4.4 Qt Creator 与 Code::Blocks 的编译器注册
Qt Creator 上架一套工具链只需两步:工具 → 选项 → Kits → 编译器 → 添加 → GCC,然后把编译器路径选到g++.exe;再在 Kits 里新建或修改已有的 Kit,指定 Qt 版本和 CMake 生成器为 MinGW。Code::Blocks 类似,Settings → Compiler → Global compiler settings → Toolchain executables,把编译器目录改成D:\dev\mingw64。这两步没什么玄学,核心就是让它找到gcc.exe和gdb.exe,剩下都是自动化检测。
5. 常见问题与排查:五条真实踩坑记录
5.1 配完 Path 仍然提示“不是内部或外部命令”
现象:手动加完环境变量,重开 cmd 执行gcc还是提示无法识别。
原因:最常见是终端没重开;也可能是加到了用户变量,而当前终端是管理员权限,部分环境下管理员终端不继承用户 Path;还有可能是路径里写了中文或空格,导致找不到 gcc.exe。
解决:先echo %Path%看变量是否包含mingw64\bin,没有就重开终端;依然不行就加到系统变量里,用where gcc和dir D:\dev\mingw64\bin\gcc.exe双重确认文件存在。我自己的习惯是直接在系统变量里加,省掉权限差异的干扰。
5.2 编译通过,运行时提示缺少 libgcc_s_seh-1.dll
现象:hello.exe在自己机器上能跑,拷到没有安装 MinGW 的机器上提示缺少libgcc_s_seh-1.dll或libstdc++-6.dll、libwinpthread-1.dll。
原因:GCC 默认动态链接这几个运行时库,exe 依赖 MinGW 目录下的 DLL,目标机器上没有它们就启动失败。
解决:分发时把mingw64\bin下的libgcc_s_seh-1.dll、libstdc++-6.dll、libwinpthread-1.dll一起拷走,或者编译时加静态链接参数:
g++ hello.cpp -o hello.exe -std=c++17 -static -static-libgcc -static-libstdc++-static让链接器尽量静态链接所有库,-static-libgcc和-static-libstdc++单独控制 GCC 和 C++ 标准库的链接方式。静态后 exe 体积会从几十 KB 涨到几 MB,但部署时不用再带 DLL。做工具类软件我一般直接静态,省心。
5.3 CMake 明明装了 MinGW,却还是去用 MSVC
现象:执行cmake -S . -B build后输出显示 “The C compiler identification is MSVC”,或者直接报找不到编译器。
原因:CMake 默认生成器是 Visual Studio,如果没加-G "MinGW Makefiles",它优先探测 MSVC;另外项目目录里残留的CMakeCache.txt会缓存旧编译器路径,干扰新配置。
解决:删掉 build 目录和CMakeCache.txt,重新执行带-G "MinGW Makefiles" -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++的完整命令。这步常被漏掉,很多人反复cmake ..但结果不变,就是缓存没清。
5.4 多线程代码链接时报 undefined reference to pthread_create
现象:使用std::thread或链接依赖 pthread 的库时,报undefined reference to 'pthread_create'。
原因:编译器本身是 win32 线程模型,没有 winpthreads 实现;或者链接命令里没带上-lwinpthread。posix版本虽然自带 pthread 实现,但有些链接场景还是需要显式加库。
解决:先用gcc -v确认 Thread model 那行是posix还是win32。如果是 win32 版本,换回 posix 版本;如果已经是 posix,就在链接参数里补一句:
g++ test.cpp -o test.exe -std=c++17 -lwinpthread-lwinpthread显式链接 MinGW-w64 打包的 pthread 实现,能解决绝大多数这类报错。
5.5 装了新版 GCC,编译时却用旧版头文件
现象:gcc --version显示 13.1.0,但编译时用的标准库头文件报版本不符,或where gcc同时列出多个路径。
原因:机器上装了多个 MinGW 版本,旧版的bin目录靠前的 Position 被优先调用,exe 是找到了,头文件和库可能被新版本或CPLUS_INCLUDE_PATH环境变量污染。
解决:把新版路径在 Path 中前移,或者干脆删掉旧版环境变量;在项目里做验证时用gcc -E -v -x c++ /dev/null看实际的 include 搜索路径,确认指向新版本的include目录。从那以后我每次装新工具链,都会强制走一遍“版本号→解压位置→Path 优先级→gcc -v→编译冒烟”五步,确认没有路径交叉才接手下一步。
6. 进阶技巧:静态分发与多版本共存
工具链装好后还能进一步优化日常使用。一个实用技巧是把固定参数写进别名或脚本,而不是每次敲一长串。比如静态分发项目的编译命令,我在 Windows Terminal 的 PowerShell profile 里定义一个函数:
function build-release($name) { g++ "$name.cpp" -o "$name.exe" -std=c++17 -O2 -static -static-libgcc -static-libstdc++ }-O2开启较高级优化,-static系参数保证 exe 不依赖外部 DLL。这样交付给同事时,直接拷贝单个 exe 就能跑。
多版本共存时,我维护一个D:\dev\下的目录约定:mingw64-13、mingw-w64-11按版本分目录,切换时只改 Path 顺序,不卸载旧版本。验证当前生效版本用两行命令交叉确认:
where gcc ldd main.exewhere gcc确认实际调用的编译器路径,ldd列出 exe 依赖的 DLL,如果有 DLL 路径指向某个旧版目录,就说明链接阶段没走对。这比单纯看gcc --version更可靠,因为后者只看编译器自身,不反映链接器找的库路径。
这个离线包本身没有魔法,价值在于把一整条工具链固定在了一个可复现的状态里。确认好版本命名、解压位置、Path 优先级、环境变量刷新、编译冒烟这五步,后面所有项目都稳了。希望帮到你。
本文还有配套的精品资源,点击获取