简介:本资源为适配 Windows 10 64 位系统的 MinGW 安装包,版本 V14.12.0,面向需要在 Windows 平台搭建类 Unix 开发环境的 C/C++ 开发者与编程学习者。MinGW 源自 GNU 编译器集合,核心组件为 GCC 编译链,可支持 C、C++ 等多种语言的编译与调试,帮助用户在 Windows 上获得稳定的命令行编译体验。压缩包采用 7z 格式,共约 2000 个文件,整体约 79.98MB,其中以 918 个 h 头文件、808 个 py 脚本、243 个 hpp 头文件为主,另含少量 c 源码、sh 脚本及 txt、md 说明文档,覆盖编译器、标准库与辅助工具等模块。目前已有 365 人学习下载。对于希望深入理解 GCC 编译链组成、练习跨平台编译或配置本地开发环境的读者,该包提供了较完整的工具集合,可结合目录结构快速定位头文件与库文件,便于后续开发与排错。
1. 为什么我还在 Win10 上留着一份 MinGW V14.12.0 安装包
上周帮同事调一个 CMake 工程,他机器上装了三个版本的编译器,gcc -v一敲出来是 8.1.0,CMake 却死活找的是另一个路径下的 13.2.0,链接阶段直接报undefined reference to __imp___acrt_iob_func。折腾一下午,最后发现根因是 MinGW 装了两份、PATH 顺序乱了。这种玄学问题,在 Windows 上做 C/C++ 开发的人多少都遇到过。所以我自己机器上一直留着一份干净的 MinGW V14.12.0 安装包,专门用来给新环境做基线。
这份资源就是 Windows 10 64 位可用的 MinGW 安装包,版本号 V14.12.0,对应的是 GCC 14 系列的编译链。它能解决的核心问题很直接:在 Windows 上拿到一套不依赖 Visual Studio、开箱能用的 GCC 工具链,编译 C、C++、Fortran,配合 CMake、Make、VS Code 都能跑。适合谁?一是要写跨平台 C/C++ 但不想装几个 G 的 MSVC 的人,二是学生和刚入行的同学,三是需要复现 Linux 下编译行为、又不想开虚拟机的场景。下面我按「这东西是什么 → 怎么装怎么用 → 坑在哪 → 怎么验证」的顺序拆一遍。
2. MinGW V14.12.0 到底是什么:和 MSVC 的区别、目录结构与选型理由
2.1 MinGW、MinGW-w64 与 GCC 编译链的关系
先把概念理清楚,不然下载完解压一看目录就懵。MinGW 全称 Minimalist GNU for Windows,本质是把 GNU 工具链(GCC、binutils、gdb、make 等)移植到 Windows 上,让你在 Windows 里用gcc、g++这套命令。早期的 MinGW 只支持 32 位,后来社区分出了 MinGW-w64 项目,同时支持 32 位和 64 位,还补上了对 Windows API 的更完整支持。现在大家说的「MinGW 安装包」,绝大多数实际是 MinGW-w64 的构建产物。
V14.12.0 这个版本号,对应的是 GCC 14 系列。GCC 14 相比 13 在 C++23 支持、诊断信息可读性、编译速度上都有提升,尤其是模板报错,比以前友好不少。这套工具链里你会看到这些核心组件:
| 组件 | 作用 | 常用命令 |
|---|---|---|
| gcc | C 编译器 | gcc main.c -o main.exe |
| g++ | C++ 编译器 | g++ main.cpp -o main.exe |
| gdb | 调试器 | gdb ./main.exe |
| mingw32-make | make 的 Windows 版 | mingw32-make |
| windres | 资源编译 | windres res.rc -o res.o |
| ar / ranlib | 静态库打包 | ar rcs libfoo.a foo.o |
选型上,为什么不用 MSVC?MSVC 和 Windows 集成更好,调试体验、PDB 符号、和 Visual Studio 的配合是它的强项。但 MSVC 的编译器行为和 GCC 有差异,很多开源库(尤其是 Linux 优先的项目)默认按 GCC 写构建脚本,用 MSVC 编译经常要改代码。MinGW 的好处是编译行为和 Linux 下的 GCC 基本一致,同一份 CMakeLists 在两边都能跑,跨平台成本低。这就是「msvc 和 mingw 区别」这个搜索词背后的真实诉求:不是谁更好,而是你的项目按哪套工具链写的。
2.2 目录结构:bin、lib、include 各放什么
解压后你会看到一个类似mingw64的根目录,里面几个关键子目录必须认识:
bin:所有可执行文件,gcc.exe、g++.exe、gdb.exe、mingw32-make.exe都在这里。这个目录必须进 PATH。lib:静态库、导入库、GCC 的内部库。链接时找不到-lxxx多半是这里的问题。include:C 和 C++ 标准库头文件,还有 Windows API 头文件。libexec:GCC 内部调用的子程序,比如cc1plus.exe,一般不用手动碰。share:文档和 locale 数据。
理解这个结构的意义在于:当你遇到「找不到头文件」或「找不到库」时,能快速判断是 include 路径没配、还是 lib 路径没配,而不是盲目重装。
2.3 为什么选 V14.12.0 而不是更新的版本
版本选择上有个现实考量。GCC 每个大版本都会引入新的语言特性和 ABI 变化,太新的版本有时候反而会踩到第三方库还没跟上的坑。V14.12.0 属于 GCC 14 系列里比较成熟的构建,C++20 支持完整,C++23 大部分可用,同时主流库(Boost、Qt、OpenCV)对 GCC 14 的兼容已经稳定。如果你在做 Qt + MinGW 的组合,Qt 官方对 MinGW 版本有对应要求,装之前最好确认一下你的 Qt 版本推荐哪个 GCC 大版本,避免 ABI 不匹配导致链接失败。常见做法是:先确定项目依赖库支持的最高 GCC 版本,再倒推选哪个 MinGW 构建。
3. 从解压到跑通第一个程序:环境变量、PATH 顺序与 CMake 联动
3.1 解压路径选择与 PATH 配置
安装包拿到手,第一步是选解压路径。血泪经验:路径里不要有空格和中文。C:\Program Files\这种带空格的路径,在某些老旧的 Makefile 和构建脚本里会因为没加引号而解析失败,报错信息还特别隐晦。我一般固定放在C:\mingw64或者D:\tools\mingw64。
解压完之后配环境变量。Win10 的操作路径是:此电脑右键 → 属性 → 高级系统设置 → 环境变量 → 系统变量里的 Path → 编辑 → 新建,把C:\mingw64\bin加进去。
# 配置完成后,新开一个 cmd 或 PowerShell 验证 gcc -v g++ -v gdb -vgcc -v会输出一大段配置信息,重点看两行:一是Target: x86_64-w64-mingw32,确认是 64 位目标;二是gcc version 14.x.x,确认版本对得上。如果提示'gcc' 不是内部或外部命令,说明 PATH 没生效,先确认是不是开的新终端窗口——环境变量修改后,已经打开的终端不会自动刷新。
提示:PATH 里如果同时存在多个 MinGW 的 bin 目录,谁在前面谁生效。这就是开头那个同事踩的坑。装新版本前,先把旧的 PATH 条目删掉或挪到后面。
3.2 编译第一个 C 和 C++ 程序
环境配好,写个最小程序验证。新建hello.c:
#include <stdio.h> int main(void) { printf("Hello from MinGW GCC 14\n"); return 0; }编译运行:
gcc hello.c -o hello.exe ./hello.exeC++ 版本hello.cpp:
#include <iostream> #include <vector> int main() { std::vector<int> v{1, 2, 3}; for (int x : v) std::cout << x << " "; std::cout << "\n"; return 0; }g++ -std=c++20 hello.cpp -o hello_cpp.exe ./hello_cpp.exe参数说明:-std=c++20指定语言标准,GCC 14 默认是 gnu++17,写 C++20 代码必须显式指定,否则concept、ranges这些会报错。-o指定输出文件名,不写的话 Windows 下默认生成a.exe。-Wall -Wextra建议常开,能提前暴露很多问题:
g++ -std=c++20 -Wall -Wextra -O2 hello.cpp -o hello_cpp.exe-O2是优化等级,调试阶段用-g -O0,发布用-O2或-O3。这几个参数是日常编译的基本盘,建议直接固化到你的构建脚本或 VS Code 的 tasks.json 里。
3.3 和 CMake 联动:指定编译器与生成器
单独用 gcc 命令编译小文件没问题,工程一大就得上 CMake。MinGW 和 CMake 配合的关键是在配置阶段就指定编译器和生成器,不要让 CMake 自己猜。一个典型流程:
# 在工程根目录下 cmake -S . -B build -G "MinGW Makefiles" \ -DCMAKE_C_COMPILER=gcc \ -DCMAKE_CXX_COMPILER=g++ \ -DCMAKE_BUILD_TYPE=Release cmake --build build -j 8参数逐个说:-S .指定源码目录,-B build指定构建目录,两者分离是推荐做法,避免污染源码树。-G "MinGW Makefiles"指定生成器,这一步很关键——如果不指定,CMake 在 Windows 上可能默认去找 Visual Studio 的生成器,然后报找不到cl.exe。-DCMAKE_C_COMPILER和-DCMAKE_CXX_COMPILER显式锁定编译器,防止 CMake 从 PATH 里挑到别的版本。-DCMAKE_BUILD_TYPE=Release控制优化和调试信息,Debug 模式下会带上-g。
cmake --build build -j 8里的-j 8是并行编译的线程数,按你 CPU 核心数设,能明显加快大工程的编译速度。如果构建时报mingw32-make: command not found,说明 CMake 找到了生成器但没找到 make 程序,检查C:\mingw64\bin里有没有mingw32-make.exe,以及 PATH 是否包含它。
注意:CMake 缓存会记住第一次配置时的编译器路径。如果你换了 MinGW 版本,一定要删掉
build目录重新配置,否则 CMake 还在用旧的编译器路径,报错信息会让你怀疑人生。
4. 避坑与排查:PATH 冲突、链接错误、中文乱码这几件事
4.1 现象:gcc -v显示的版本和预期不符
原因:PATH 里存在多个 MinGW 的 bin 目录,系统按顺序取第一个匹配的。或者之前装过 Dev-C++、Code::Blocks 这类自带 MinGW 的 IDE,它们的 bin 目录也在 PATH 里。
解决:在 cmd 里执行where gcc,会列出所有匹配的 gcc 路径,按顺序看哪个在最前面。把不需要的从 PATH 里删掉,或者把目标 MinGW 的 bin 目录挪到最前。改完必须开新终端。
4.2 现象:链接时报undefined reference to __imp___acrt_iob_func
原因:这是 MinGW 和 MSVC 混用运行库的典型症状。某个库是用 MSVC 编译的(依赖ucrt或msvcrt的特定符号),你的代码用 MinGW 编译,两边对 C 运行库的符号约定不一致。
解决:确认所有依赖库都是同一套工具链编译的。如果用的是预编译的第三方库,看清楚它是 MinGW 版还是 MSVC 版。MinGW 的库文件名通常带lib前缀(libfoo.a),MSVC 的是foo.lib。混用基本必挂,没有后悔药,只能换库或自己用 MinGW 重新编译。
4.3 现象:程序输出中文变成乱码
原因:Windows 控制台默认代码页是 GBK(936),而 GCC 编译出的程序字符串按 UTF-8 存储,两边编码不一致。
解决:两个方向。一是编译时加-fexec-charset=GBK,让可执行文件里的字符串按 GBK 存:
gcc main.c -o main.exe -fexec-charset=GBK二是改控制台代码页,在程序开头或运行前执行chcp 65001切到 UTF-8。我一般推荐第二种,源码保持 UTF-8,跨平台时不用改编译参数。VS Code 的集成终端可以在 settings 里配"terminal.integrated.defaultProfile.windows"配合启动命令自动切。
4.4 现象:fopen报安全错误或返回 NULL
原因:这个和「c++ 64 位 fopen 报安全错误」是同一类问题。MSVC 会强制要求用fopen_s,但 MinGW 的 GCC 默认还是标准fopen。如果你在 MinGW 下遇到fopen失败,多半不是安全函数的问题,而是路径里的反斜杠没转义,或者文件确实不存在。
解决:Windows 路径在 C 字符串里要写"C:\\data\\file.txt"或"C:/data/file.txt"。用fopen后一定检查返回值,配合perror打印具体错误:
FILE *fp = fopen("C:/data/file.txt", "r"); if (!fp) { perror("fopen failed"); return 1; }perror会输出No such file or directory这类可读信息,比干瞪眼强。
4.5 现象:CMake 配置时找不到编译器
原因:-G "MinGW Makefiles"指定了,但 CMake 在 PATH 里找不到gcc,或者找到了但版本不满足CMakeLists.txt里的cmake_minimum_required。
解决:先在同一个终端里手动跑gcc -v确认可用,再跑 CMake。如果gcc可用但 CMake 还是报错,检查是不是在 CMake GUI 里配置的——GUI 的环境变量可能和终端不一致。命令行配置最稳。另外,删掉build目录里的CMakeCache.txt重新配置,能解决大部分「明明改了却没用」的玄学问题。
5. 进阶验证:用一套最小工程把工具链跑穿
装完编译器、跑通 hello world 只是及格线。真正验证一套 MinGW 工具链是否可用,我习惯用一个最小工程把「编译 → 链接静态库 → CMake 构建 → gdb 调试」整条链路走一遍。这一步能提前暴露 90% 的环境问题,比等到大工程里再翻车划算得多。
先建一个静态库。math_utils.h:
#pragma once int add(int a, int b);math_utils.cpp:
#include "math_utils.h" int add(int a, int b) { return a + b; }编译成静态库:
g++ -c math_utils.cpp -o math_utils.o ar rcs libmath_utils.a math_utils.oar rcs三个参数分别是:r插入成员,c创建库(不存在时),s生成索引。生成的libmath_utils.a就是静态库。然后写主程序链接它:
#include <iostream> #include "math_utils.h" int main() { std::cout << add(3, 4) << "\n"; return 0; }g++ main.cpp -L. -lmath_utils -o app.exe ./app.exe-L.告诉链接器在当前目录找库,-lmath_utils指定库名(注意不带lib前缀和.a后缀,这是 GCC 的约定)。如果报cannot find -lmath_utils,检查库文件名是不是严格叫libmath_utils.a,以及-L路径对不对。
接着用 CMake 把这套东西组织起来,CMakeLists.txt:
cmake_minimum_required(VERSION 3.20) project(min_demo CXX) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_library(math_utils STATIC math_utils.cpp) add_executable(app main.cpp) target_link_libraries(app PRIVATE math_utils)配置构建:
cmake -S . -B build -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Debug cmake --build build -j 8 ./build/app.exe最后验证调试器。用-g编译后:
gdb ./build/app.exe进入 gdb 后break main、run、next、print a走一遍。如果 gdb 能正常断点、查看变量,说明这套工具链的编译、链接、调试三个环节都通了。这一步很多人跳过,结果真到调试时发现 gdb 版本和 GCC 不匹配,又得回头折腾。
从那以后我每次在新机器上配 MinGW,都强制走一遍这个最小工程,确认gcc -v、ar、cmake、gdb四个环节全绿,才敢往上面堆真实项目。这套流程花不了十分钟,但能省掉后面几小时的排查。希望帮到你。
本文还有配套的精品资源,点击获取