简介:本资源为Windows平台配置MinGW与mingw64的完整工具包,面向需要在64位Windows系统上进行C、C++开发的初学者与进阶程序员,帮助解决编译器安装、组件选择与环境变量配置等常见问题。压缩包共约2000个文件,整体大小129.46MB,以896个py脚本、787个h头文件、243个hpp头文件为主,另含少量txt说明、sh脚本与c源码,覆盖编译器、标准库头文件及开发工具链,目录结构完整便于按需取用。目前已有3798人学习下载,适合作为搭建本地GCC开发环境的参考。读者可从中获得MinGW64的完整组件、头文件与工具集,配合环境变量配置与g++、gcc编译测试,快速验证安装是否成功,并进一步对接Code::Blocks、Qt Creator或Visual Studio等IDE,为后续C/C++项目开发与自动化构建打下基础。
1. 从一次编译翻车说起:为什么 Windows 上需要 MinGW-w64 完整包
在 Windows 上装 MinGW-w64,很多人第一次都栽在同一个坑里:从网上随手下了个压缩包,解压后gcc --version能跑,但一编译带#include <thread>或<filesystem>的代码就报一堆链接错误,或者g++找不到libstdc++。这不是你代码写错了,而是拿到的是残缺包——只含 C 编译器、缺 C++ 运行库、缺 winpthread、缺头文件。所谓「完整包」,核心就是一次性把编译器、C/C++ 标准库、Windows API 头文件、线程模型和调试器配齐,让gcc、g++、gdb、mingw32-make开箱即用。这篇面向在 Windows 上做 C/C++ 开发、需要一套干净工具链的人:学生、嵌入式上位机开发者、想用 CMake 交叉验证代码的工程师。下面按「选哪个包 → 怎么装 → 怎么验证 → 坑在哪」走一遍,都是我反复装过多次后留下的可复现步骤。
2. 选对发行版:MinGW-w64 完整包到底该下哪一个
2.1 先分清 MinGW、MinGW-w64 和 MSVC 的边界
很多人把 MinGW 和 MinGW-w64 当同一个东西,其实前者早已停止维护,只支持 32 位、不支持新的 C++ 标准;MinGW-w64 是社区接手的续作,同时支持 32/64 位,是现在 Windows 上 GCC 工具链的事实标准。它和 MSVC 的区别也要先想清楚:MSVC 是微软自家工具链,和 Visual Studio 深度绑定,生成的程序依赖 MSVC 运行库;MinGW-w64 基于 GCC,生成的是原生 Windows 程序,不依赖额外运行库分发,跨平台代码迁移更顺。热搜里常出现「msvc 和 mingw 区别」「cmake 与 mingw」,本质就是选工具链:如果你要编译 Qt、FFmpeg 这类跨平台库,MinGW-w64 往往比 MSVC 少踩配置坑;如果你只做 Windows 原生、要用 MFC 或 COM 重活,MSVC 更合适。选 MinGW-w64 的典型理由:开源、命令行友好、和 CMake/Make 天然契合、能编出独立 exe。
2.2 发行版怎么挑:WinLibs、MSYS2、官方构建的取舍
MinGW-w64 本身只是源码项目,你下载到的「完整包」其实是别人编译好的发行版。常见三类:
| 发行版 | 特点 | 适合谁 |
|---|---|---|
| WinLibs 独立包 | 单压缩包,解压即用,含 GCC/GDB/mingw32-make,无需安装器 | 想快速上手、不想折腾包管理 |
| MSYS2 | 带包管理器 pacman,可装完整工具链和大量库 | 需要长期维护、装第三方库 |
| 官方/其他构建 | 版本更新快,但目录结构不统一 | 有特定版本需求的人 |
我一般推荐新手先用 WinLibs 的完整包,因为它把 UCRT 或 MSVCRT 运行库、POSIX 线程模型、C++ 标准库都打进去了,解压后配个 PATH 就能用,不用先学 pacman。注意选包时看三个关键字段:架构(x86_64)、线程模型(posix 还是 win32)、异常模型(seh 还是 sjlj)。做 C++ 多线程和异常处理,优先 posix + seh。
2.3 下载时认准「完整包」的三个标志
网上搜「mingw 官网下载」「mingw64 完整包」,结果鱼龙混杂。判断是不是完整包,看三点:一是压缩包体积,完整包通常几百 MB,几十 MB 的多半是精简版;二是解压后bin目录里有没有gcc.exe、g++.exe、gdb.exe、mingw32-make.exe四个都在;三是lib目录里有没有libstdc++、libgcc、libwinpthread相关文件。缺任何一个,后面编译 C++ 都可能翻车。这一步多花两分钟核对,能省掉后面几小时的排错。
3. 从解压到 PATH:把完整包在 Windows 上跑起来
3.1 解压路径的选择与目录结构确认
下载到完整包后,解压路径有讲究。不要放在带空格或中文的目录,比如C:\Program Files\或D:\我的工具\,GCC 和 Make 对空格路径的处理时好时坏,是经典玄学来源。我一般固定放C:\mingw64,解压后确认目录结构:
C:\mingw64\ ├── bin\ # gcc.exe g++.exe gdb.exe mingw32-make.exe ├── include\ # C/C++ 标准库头文件 ├── lib\ # 运行库和静态库 ├── libexec\ # 内部工具 └── share\ # 文档如果解压出来多套了一层同名目录,比如C:\mingw64\mingw64\bin,要么把内层提上来,要么 PATH 指到内层,别让路径多一层导致找不到。确认bin里有g++.exe是完整包的第一道验证。
3.2 配置 PATH:命令行和图形界面两种改法
配 PATH 是让系统在任何目录都能找到gcc。图形界面做法:此电脑右键 → 属性 → 高级系统设置 → 环境变量 → 在「系统变量」里找到 Path → 编辑 → 新建 → 填C:\mingw64\bin→ 一路确定。命令行做法(管理员 PowerShell):
# 把 MinGW-w64 的 bin 目录追加到系统 PATH,避免覆盖已有项 $old = [Environment]::GetEnvironmentVariable("Path", "Machine") $new = $old + ";C:\mingw64\bin" [Environment]::SetEnvironmentVariable("Path", $new, "Machine")参数说明:Machine表示改系统级变量,对所有用户生效;如果只想当前用户生效,换成User。改完必须重开终端,旧终端读的是旧环境。验证:
where gcc gcc --version g++ --versionwhere gcc应输出C:\mingw64\bin\gcc.exe。如果输出多个路径,说明系统里还有别的 GCC,注意优先级,必要时把C:\mingw64\bin上移。
3.3 用一段 C++17 代码验证完整包是否真的完整
光看版本号不够,要编一段用到线程和文件系统的代码,才能验证 C++ 标准库和 winpthread 是否齐全。新建test.cpp:
#include <iostream> #include <thread> #include <filesystem> int main() { // 验证 C++11 线程库,需要 posix 线程模型支持 std::thread t([]{ std::cout << "thread ok\n"; }); t.join(); // 验证 C++17 文件系统库,需要完整 libstdc++ std::filesystem::path p = std::filesystem::current_path(); std::cout << "cwd: " << p.string() << "\n"; return 0; }编译命令:
g++ -std=c++17 test.cpp -o test.exe -pthread参数说明:-std=c++17指定标准;-pthread链接 winpthread,线程模型是 posix 时必需;-o指定输出。如果报undefined reference to std::thread,多半是线程模型选了 win32 或包不完整;如果报filesystem相关链接错误,说明 libstdc++ 版本旧或缺失。跑通test.exe输出两行,才算完整包验证通过。
3.4 顺手配好 gdb 和 mingw32-make
完整包一般自带gdb.exe和mingw32-make.exe。验证调试器:
g++ -g test.cpp -o test_dbg.exe -pthread gdb test_dbg.exe进入 gdb 后输入run能跑、bt能看栈,说明调试符号正常。mingw32-make用于跑 Makefile,注意它和 Linux 的make同名不同名,写 Makefile 时命令前用 Tab 缩进,别用空格,否则报missing separator。到这一步,一套可用的 MinGW-w64 完整包就落地了。
4. 和 CMake、Qt、FFmpeg 配合时的常见坑与排查
4.1 坑一:CMake 默认找到 MSVC 而不是 MinGW
现象:cmake ..后生成的工程用 MSVC 编译,或者报找不到gcc。原因:CMake 在 Windows 上默认优先探测 Visual Studio 生成器。解决:显式指定生成器。
cmake -G "MinGW Makefiles" -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ .. cmake --build .参数说明:-G "MinGW Makefiles"强制用 MinGW 的 Makefile 生成器;两个CMAKE_*_COMPILER明确编译器路径,避免 CMake 猜错。如果之前生成过缓存,先删掉CMakeCache.txt再重来,否则旧缓存会继续用 MSVC。
4.2 坑二:编译 FFmpeg 或第三方库时报缺 dll
现象:链接通过,运行 exe 弹窗提示缺libwinpthread-1.dll或libstdc++-6.dll。原因:MinGW-w64 默认动态链接运行库,exe 依赖同目录或 PATH 里的 dll。解决:要么把C:\mingw64\bin加进 PATH,要么静态链接。
g++ -std=c++17 test.cpp -o test.exe -pthread -static -static-libgcc -static-libstdc++参数说明:-static静态链接系统库,-static-libgcc、-static-libstdc++分别静态链接 GCC 和 C++ 运行库。静态链接后 exe 变大但可独立分发。注意某些库不支持全静态,会报冲突,这时退回动态链接并随包分发 dll。
4.3 坑三:Qt 装完 MinGW 编译器后工具链对不上
现象:Qt Creator 里 Kit 显示黄色感叹号,或编译报 ABI 不匹配。原因:Qt 自带的 MinGW 版本和你手动装的完整包版本不一致,混用会出问题。解决:要么统一用 Qt 自带的那个 MinGW,要么在 Qt Creator 的「工具 → 选项 → Kits → 编译器」里手动添加C:\mingw64\bin\g++.exe,并确保 Kit 里的 Qt 版本和编译器 ABI 一致。热搜里「qt 安装完 mingw 编译器后怎么安装 msvc 编译工具链」也是同类问题:一个 Qt 版本最好只配一套工具链,混装容易在链接阶段翻车。
4.4 坑四:PATH 里有多个 GCC 导致版本错乱
现象:gcc --version显示的版本和你刚装的不一样。原因:系统里还有别的工具链(比如 Dev-C++、旧版 CodeBlocks 自带)排在 PATH 前面。解决:where gcc列出所有,把C:\mingw64\bin移到最前,或删掉不用的旧工具链路径。这个坑很隐蔽,编译报错时先确认用的到底是哪个 gcc。
4.5 坑五:中文路径和空格路径引发的诡异报错
现象:编译时报No such file or directory,但文件明明存在。原因:路径含中文或空格,Make 和部分工具解析失败。解决:工程和工具链都放纯英文无空格路径,比如C:\mingw64和D:\code\demo。这是血泪经验,别图省事放桌面或「我的文档」。
5. 进阶:把完整包做成可复用的便携工具链
装好只是开始,真正省事的是把它变成可复用、可迁移的便携环境。我的习惯是:把C:\mingw64整个目录当成一个绿色包,配合一个启动脚本,在任何机器上解压即用,不污染系统 PATH。
@echo off REM 便携启动:临时把 MinGW-w64 加入当前会话 PATH set PATH=%~dp0mingw64\bin;%PATH% echo MinGW-w64 ready: gcc --version | findstr "gcc" cmd /k参数说明:%~dp0是脚本所在目录,保证换机器后路径自动跟随;set PATH只影响当前命令行会话,不改系统变量;cmd /k保持窗口不关。这样一套完整包可以放 U 盘或同步盘,换电脑解压就能编。
再进一步,用 CMake 的 toolchain 文件固定编译器,团队协作时避免每人环境不同:
# mingw-toolchain.cmake set(CMAKE_SYSTEM_NAME Windows) set(CMAKE_C_COMPILER C:/mingw64/bin/gcc.exe) set(CMAKE_CXX_COMPILER C:/mingw64/bin/g++.exe) set(CMAKE_MAKE_PROGRAM C:/mingw64/bin/mingw32-make.exe)调用时cmake -DCMAKE_TOOLCHAIN_FILE=mingw-toolchain.cmake ..,编译器路径写死,谁跑都一样。验证便携环境是否干净,可以在一台没装过任何 GCC 的机器上解压运行,g++ -std=c++17编上面那段线程代码,能出 exe 就说明完整包真的完整。我踩过最深的坑是早期图省事用了精简包,结果一个std::thread折腾一下午,后来固定用完整包加便携脚本,换机器再没翻过车。希望帮到你。
本文还有配套的精品资源,点击获取