
简介MinGW-w64 是一套面向 Windows 平台的 C/C 编译器工具链。这份压缩包由作者在实际使用中整理上传主要解决官方渠道下载慢、容易失败的问题解压后无需安装即可配合 Visual Studio Code 配置 C 编译、运行与调试环境适合需要在 Windows 上快速搭建本地 C 开发环境的初学者和开发者无论是课程实验、日常练习还是小型项目开发都可直接使用。压缩包内含约 2000 个文件以 h 头文件、hpp 头文件、a 静态库、dll 动态库、exe 编译工具、py 辅助脚本等类型为主整体约 114MB覆盖编译器驱动、标准库头文件、静态与动态链接库以及运行所需的相关组件结构较为完整。目前已有 1800 余人学习下载。资源将完整 MinGW-w64 工具链打包为可直接使用的压缩包避免官方源不稳定带来的安装失败风险也可作为离线备用工具链随时拷贝到其他机器帮助用户在 Windows VSCode 环境中更快上手 C/C 开发。 说实话我见过不少刚学 C/C 的朋友第一道坎不是语法而是环境配不起来。网上教程五花八门有的让你装 Visual Studio一装就是十几个 G有的让你用全家桶 IDE打开等半天。今天这篇我就用我一直在用的 MinGW-w64C 编译器配合 VS Code 完整走一遍从一个干净的 Windows 系统开始讲到你能编译、能调试、能跑多文件项目。整个过程不复杂但里面有些坑我踩过很多次这次一并讲清楚。MinGW-w64 的核心价值很简单它让 Windows 拥有了一套完整的 GNU 工具链g、gcc、gdb、ld 全都齐了。你不用装虚拟机不用切换到 Linux在本地就能编译 C/C 程序生成原生的 Windows 可执行文件。对于学生做作业、算法刷题、或者开发轻量级工具来说这套组合基本是效率最优解。1. MinGW-w64 到底是什么为什么大家都在用1.1 一句话讲清楚它和 GCC 的关系MinGW 的全称是 Minimalist GNU for Windows意思是在 Windows 上提供一套最小化的 GNU 工具集。它把 Linux 上那套大名鼎鼎的 GCC 编译器的 Windows 移植版带了进来而后面的 w64 表示支持 64 位程序。所以你装上 MinGW-w64 之后系统里就有了 gcc、g、gdb、ar、ld 这些熟悉的命令。GCC 本身是三大主流 C/C 编译器之一另外两个是 MSVC 和 Clang它负责把人能读懂的源代码翻译成 CPU 能执行的机器指令。MinGW-w64 就是让这套编译器能原生跑在 Windows 上不经过任何模拟层。这里用生活化的类比GCC 就像一台发动机MinGW-w64 就是这台发动机在 Windows 这辆车上做好的适配安装方案。装上之后你不需要关心底层那些复杂的系统调用差异只需要正常调用 g 就能产出 .exe 文件。1.2 为什么不建议无脑装 MSVC 或 Cygwin很多新手一搜Windows C 编译器结果跳出来的要么是 Visual Studio 的 MSVC要么是 Cygwin。这两个不是不能用而是对于大多数场景来说不太顺手。编译器方案体积原生性命令行体验适合场景MSVC几个 G 到十几个 G原生 Windows 程序cl 命令参数复杂需要配合 vcvarsall大型 Windows 桌面应用、企业级开发Cygwin较大编译产物依赖 cygwin1.dll命令接近 Linux但分发程序麻烦需要在 Windows 上跑 Linux 经典工具链MinGW-w64几百 MB原生 Windows 程序无额外依赖g/gcc 命令和 Linux 上几乎一致算法、教学、轻量级项目、跨平台开发Cygwin 编译出来的程序默认依赖一个 cygwin1.dll 文件你要把程序发给别人时还得把这个 dll 一并带过去否则对方双击会直接报找不到 cygwin1.dll。MSVC 则是重量级选手装完 VS 之后还得在特定命令行环境里才能用 cl 命令对新手不友好对只想快速写个算法的场景更是杀鸡用牛刀。MinGW-w64 生成的 exe 是原生的依赖的只是 Windows 自带的 API分发时一个文件就能拷走。1.3 版本选择Posix、Win32、SEH、SJLJ 都是什么去 MinGW-w64 官网下载时很多人会被几个下拉框绕晕。这里的关键选项有三个。第一Address model 选 x86_64 还是 i686。这个看你的操作系统位数现代电脑基本 64 位选 x86_64 就对了。第二Threads 选 posix 还是 win32。这个非常关键如果你在代码里用了 std::thread、std::async 这些 C11 标准线程库必须选 posix 模型因为标准库的线程实现是基于 POSIX 线程接口去封装完成的。选了 win32 模型编译带 std::thread 的程序会直接报类似 undeclared identifier 的错误。第三Exception 选 seh 还是 sjlj。64 位环境下建议选 seh它的异常处理性能更好sjlj 是老式的 setjmp/longjmp 实现32 位环境下有时不得不用。所以我的选择永远是一句话x86_64 posix seh。如果你按这个组合下基本不会出问题。2. 从下载到安装手把手走一遍2.1 下载渠道和版本推荐现在网上搜 MinGW-w64链接容易跑到 SourceForge 的老旧版本上去那些是早期版本功能可能不全而且下载流程绕。我推荐直接去 winlibs.com 下载这个站点把 GCC、GDB、MinGW-w64 全部打包成 zip解压即用里面的版本也新。下载时注意选 Win64 对应的链接一般是 GDB 也包含在内。winlibs 上会看到 UCRT runtime 和 MSVCRT runtime 两个选项。简单说UCRT 是微软新一代的通用 C 运行库Win10 1809 及以上系统自带比较新MSVCRT 是老牌运行库兼容老系统。如果你不是要在老掉牙的 Windows 7 上跑直接选 UCRT。下载后的压缩包大概几百 MB如果速度不太理想可以用支持断点续传的下载工具。解压完成后你会得到一个类似 mingw64 的文件夹里面按 bin、lib、include 等标准结构排列非常规整。2.2 解压位置有讲究别踩空格的坑解压位置我强烈建议放在一个简单路径比如D:\mingw64或者C:\mingw64。千万不要放进C:\Program Files\mingw64这种带空格的路径。这不是洁癖问题而是空格会在配置环境变量、写 VS Code 的 launch.json、命令行传参时引入一堆额外麻烦。路径里一旦有空格你用 g 编译时就得给路径加引号在 tasks.json 里写配置时又得多处理一层转义排查起来尤其痛苦。解压完成后先手动检查一下D:\mingw64\bin目录下有没有 g.exe 和 gdb.exe。这两个文件一个负责编译一个负责调试缺一不可。2.3 配置 PATH 环境变量并验证接下来把编译器加进系统 PATH这样在任意终端窗口敲 g 才能被识别。操作路径是右键此电脑 - 属性 - 高级系统设置 - 环境变量在系统变量里找到 Path点击编辑然后新建一行填入D:\mingw64\bin。注意填进去的是 bin 目录不是 g.exe 文件本身。配置完成后新开一个 cmd 窗口这个新开很关键旧窗口不会刷新环境变量输入g --version能输出版本信息就说明环境已经通了。如果系统提示g 不是内部或外部命令先检查 Path 里有没有写对路径、有没有加分号分割再确认是不是在配置环境变量之前打开的终端窗口。3. VS Code 里把 C/C 环境彻底配好3.1 必装扩展C/C 和一点补充VS Code 本身只是个编辑器要让 C/C 跑起来得装官方扩展。在扩展面板里搜索并安装 C/C作者是 Microsoft这个扩展提供智能感知、代码跳转、调试支持以及生成配置文件的能力属于核心中的核心。另外推荐一个可选扩展 C/C Compile Run它提供一键编译运行的按钮适合刚开始学习、不想折腾 tasks 配置的同学。不过我建议你至少学会用原生的 tasks 方式因为那才是 VS Code 的正规军打法后面我会详细讲。3.2 c_cpp_properties.json智能感知不再满屏波浪线第一个要配置的是编译器路径和头文件路径这样才能消除代码里那些找不到头文件的红色波浪线并让代码跳转、自动补全正常工作。按CtrlShiftP输入 C/C: Edit Configurations (JSON)VS Code 会生成一个 c_cpp_properties.json 文件里面填入以下内容{ configurations: [ { name: Win32, includePath: [ ${workspaceFolder}/**, D:/mingw64/include/**, D:/mingw64/lib/gcc/x86_64-w64-mingw32/12.2.0/include/c, D:/mingw64/lib/gcc/x86_64-w64-mingw32/12.2.0/include/c/x86_64-w64-mingw32 ], defines: [_DEBUG, UNICODE, _UNICODE], compilerPath: D:/mingw64/bin/g.exe, cStandard: c17, cppStandard: c17, intelliSenseMode: windows-gcc-x64 } ], version: 4 }这里面的 includePath 可以只写${workspaceFolder}/**让 VS Code 自动搜索但有时搜索不到内部头文件就会出现奇怪的误报。我建议把 mingw64 的 include 和 lib 目录也显式列上。intelliSenseMode设置为windows-gcc-x64确保智能感知引擎知道自己面对的是哪个编译器。3.3 tasks.json把编译动作固化下来VS Code 里按CtrlShiftB能触发编译任务靠的是 tasks.json。这个文件的作用就是把编译命令封装成一个任务你不用每次手动在终端敲编译命令了。在项目根目录创建 .vscode/tasks.json写入以下配置{ version: 2.0.0, tasks: [ { type: cppbuild, label: C/C: g.exe build active file, command: D:\\mingw64\\bin\\g.exe, args: [ -fdiagnostics-coloralways, -g, ${file}, -o, ${fileDirname}\\${fileBasenameNoExtension}.exe ], options: { cwd: ${fileDirname} }, problemMatcher: [$gcc], group: { kind: build, isDefault: true }, detail: 编译器生成的调试任务。 } ] }这条 task 做的事情是用 g 编译当前打开的源文件输出到同目录下同名 exe。-g参数生成调试信息F5 调试时依赖它-fdiagnostics-coloralways让编译器输出错误诊断时带颜色避免一片白茫茫。${file}、${fileDirname}、${fileBasenameNoExtension}都是 VS Code 预定义的变量会动态替换成当前文件的信息。3.4 launch.jsonF5 一键启动调试配置完编译任务接下来配置调试。F5 在 VS Code 里的默认行为是开始调试但一开始调试器不知道该用谁、启动哪个 exe所以需要 launch.json 告诉它。在 .vscode 目录下创建 launch.json{ version: 0.2.0, configurations: [ { name: C/C: g.exe build and debug active file, type: cppdbg, request: launch, program: ${fileDirname}\\${fileBasenameNoExtension}.exe, args: [], stopAtEntry: false, cwd: ${fileDirname}, environment: [], externalConsole: false, MIMode: gdb, miDebuggerPath: D:\\mingw64\\bin\\gdb.exe, setupCommands: [ { description: Enable pretty-printing for gdb, text: -enable-pretty-printing, ignoreFailures: true } ], preLaunchTask: C/C: g.exe build active file } ] }注意两个核心字段miDebuggerPath是调试器路径指定为D:\mingw64\bin\gdb.exepreLaunchTask是启动调试前要执行的任务它和 tasks.json 里的 label 必须完全一致。这样配置完按下 F5VS Code 会自动先编译当前文件再启动 gdb 附加到你编译出来的 exe 上一气呵成不需要手动在终端里又编译又启动。4. 实操从 hello world 到多文件项目4.1 第一个程序的编译与运行新建一个文件夹比如D:\code\hello在里面放一个 test.cpp#include iostream using namespace std; int main() { cout Hello, MinGW-w64! endl; return 0; }打开这个文件后按CtrlShiftB你会看到终端里自动执行了编译命令然后生成了 test.exe。在 VS Code 终端里输入.\test.exe就能看到程序输出结果。能走到这一步说明你的环境已经打通了从源代码到可执行文件的完整链路都正常。如果你是第一次接触命令行这里有个小提醒VS Code 内置终端默认是 PowerShell运行当前目录下 exe 时需要在前面加.\否则系统会告诉你找不到命令。这和 cmd 是不同习惯也不算坑只是需要适应。4.2 命令行编译的常用参数虽然 VS Code 帮我做了很多事情但作为 C/C 开发者命令行编译的基本功还是要掌握。脱离 VS Code在 cmd 或 PowerShell 里最基础的编译命令长这样g -Wall -stdc17 -g main.cpp -o main.exe这里每个参数都不多余。-Wall开启常见警告很多隐蔽问题编译器在警告里就会指出来建议始终开启-stdc17指定 C 标准版本不指定的话 g 默认可能用老标准导致部分新语法编译不过-g生成调试信息-o指定输出文件名。如果把main.cpp换成main.cpp math.cpp utils.cppg 会一次性编译多个源文件并链接成 exe这是多文件项目的命令行编译方式。实际开发中我习惯先把命令在终端里跑通再回填到 tasks.json 里这样能快速验证参数是否正确又不至于每次都在 VS Code 里瞎试。4.3 多文件项目的编译实践拿一个典型场景举例项目里有 main.cpp、math.cpp 和 math.h。main.cpp 调用 math.cpp 里定义的 add 函数。在命令行里这样编译g -Wall -stdc17 -g main.cpp math.cpp -o app.exe注意这里没有显式在命令里写 math.h因为头文件已经被 main.cpp 通过#include math.h引入了编译器会自动从当前目录下找。但在大型项目里头文件可能分散在不同目录有嵌套引用这时候推荐用-I指定额外的头文件搜索路径g -Wall -stdc17 -g -I./include main.cpp math.cpp -o app.exe-I后面跟的是头文件目录。如果你还链接了第三方库比如 libcurl、OpenSSL 之类还需要-L指定库搜索目录-l指定库名。这是后面深入使用才会经常碰到的内容先记住这几个概念后面用得上。5. 常见问题与排查技巧实录这么多年配环境我在 MinGW-w64 上踩过不少坑这里整理成速查表问题现象根本原因解决方法提示g 不是内部或外部命令PATH 环境变量没配置或者终端不是新开的重新配置D:\mingw64\bin到系统 PATH新开终端窗口再验证程序里的中文输出变成乱码Windows 控制台代码页默认 936/GBK与源文件编码UTF-8不一致方案一源码文件编码改为 GBKVS Code 右下角点击编码切换方案二程序开头加system(chcp 65001);用了 std::thread 编译报错提示未声明安装时线程模型选了 win32不是 posix重新下载安装 posix 线程模型的版本或在代码中改用其他线程方式F5 调试时提示 Unable to start debugging要么编译没成功要么 launch.json 里的 program 路径和实际 exe 路径不一致先手动编译确认 exe 已生成再检查 launch.json 里的路径确认 preLaunchTask 的 label 一致编译时报 undefined reference 错误多文件项目只编译了 main.cpp没有把其他 .cpp 文件一起编译链接在命令或 tasks.json 中加入所有需要的源文件路径包含空格导致各种诡异问题编译器、工具链对含空格路径需要特殊转义尽量把 mingw64 解压到无空格路径如D:\mingw64杀毒软件报警误删 gdb 或 g部分杀软对工具链行为存在误报添加白名单从官方可信渠道重新下载在这些问题里最常见也最隐蔽的是编码乱码。很多人辛辛苦苦把环境装好写了一行中文输出结果控制台显示乱码瞬间心态就崩了。这个其实不怪编译器而是 Windows 控制台和源文件编码不匹配导致的。我现在的习惯是新建源文件时就统一用 UTF-8 编码然后在 main 函数第一行调用system(chcp 65001);把控制台代码页切到 UTF-8。这个方法已经帮我省掉了百分之九十九的乱码烦恼。6. 最后再分享一点我的习惯配置环境这件事我觉得关键不是一次成功而是出错之后知道去查哪里。网上那些一次配好的教程很好但你自己操作时百分之百会遇到一些细小的差异——不同编译器版本、不同系统版本、被人装乱的 PATH——这些都得靠排查思路去解决。我这些年在 MinGW-w64 上踩过的坑总结起来核心就是三句话路径里不要有空格线程模型选 posix编译不过先看准确报错信息再去百度。另外如果你以后要学习 C 网络编程、性能调优或者想接触更现代的构建系统可以再学习 CMake Ninja 的组合VS Code 也能完美支持。但 MinGW-w64 作为最底层的编译基石是一旦装好可以用很多年的基础设施。希望这篇经验能让你少走弯路把时间真正花在写代码上。本文还有配套的精品资源点击获取