Windows下MinGW-w64安装配置详解:从零搭建GCC编译环境

发布时间:2026/9/13 16:45:01
Windows下MinGW-w64安装配置详解:从零搭建GCC编译环境 1. 为什么Windows开发者需要一个正经的GCC编译器先说个扎心的事实大部分人在Windows上第一次接触C/C编程用的都是Visual Studio。VS确实够强整套IDE、调试器、编译器打包得严严实实但只要你离开VS生态半步问题就来了——CMake项目拉不下来、Linux上写好的代码在Windows上编不过、想用GCC专属的内置函数和扩展语法直接抓瞎、CI里跑个交叉编译脚本更是绕不开命令行。这时候MinGW-w64就是你必须补上的那块拼图。MinGW-w64是GCC编译器套件在Windows平台上的移植版全称是Minimalist GNU for Windows64位及32位。它原生编译出Windows可执行文件不依赖任何第三方运行时库生成的是真正的PE格式exe跑在用户电脑上不需要额外装环境。很多开源项目、嵌入式工具链比如ARM交叉编译器、CI流水线GitHub Actions的windows-latest镜像默认用的就是MinGW-w64。这篇文章写给我自己也写给所有在Windows上折腾C/C工具链的朋友。我会从零开始把MinGW-w64的下载、安装、环境变量配置、编译验证、常见坑全部过一遍每一步都写清楚为什么这么做而不是直接甩给你一条命令然后让你自己猜。2. 安装前必须搞明白的四个概念很多教程上来就让你下载安装包然后一路Next最后发现编译报错完全不知道哪出了问题。MinGW-w64的安装和Visual Studio最大的区别在于VS的安装器帮你把所有细节都包好了而MinGW-w64需要你自己做几个关键选择。这些选择直接影响你后面能不能顺利用上这个工具链。2.1 MinGW和MinGW-w64有什么区别你可能会在网上看到老教程教你装MinGW原版这个项目说实话已经处于半停滞状态了32位支持为主更新节奏非常慢。MinGW-w64是从MinGW衍生出来的分支由社区维护支持64位和32位目标对C11/14/17/20的支持完整得多还引入了posix线程模型等特性。现在除非你有特殊兼容性需求否则无脑选MinGW-w64就对了。2.2 线程模型posix还是win32这是安装时最容易被忽略的选项。简单说线程模型决定了GCC如何处理C11之后的多线程特性。posix模型在内部使用Windows线程API但对标准库提供了完整的std::thread支持还能用上libstdc的一些POSIX特性win32模型则是纯Windows线程API更轻量但某些C11多线程标准库功能无法使用。我的建议很简单不搞嵌入式交叉编译、不做极致体积优化就选posix。现在几乎所有开源库和包管理器比如vcpkg、Conan都默认按posix模型编译你用win32模型去链接别人编好的库大概率会碰到符号不匹配的问题。我自己就踩过这个坑后来全部统一成posix才消停。2.3 异常处理模型SEH还是SJLJWindows上GCC支持三种异常处理机制SEH、SJLJ、DWARF。x86_64架构下官方推荐的是SEH结构化异常处理它是Windows原生的异常机制性能最好没有额外的栈展开开销而且其他编译器MSVC、Clang也都用它兼容性最佳。SJLJsetjmp/longjmp可移植性好但性能差DWARF只在32位下可用64位不支持。Windows平台64位目标选SEH32位目标选DWARF或SJLJ这是最稳妥的方案。下载时看到x86_64-posix-seh这种命名x86_64指64位架构posix指线程模型seh指异常处理模型三个信息全在名字里了。2.4 解压版和安装版怎么选MinGW-w64的常见分发形式有两种一种是在线安装器mingw-w64-install.exe你选好参数后它在线下载另一种是别人编译好的离线解压包比如WinLibs、w64devkit。在线安装器的问题是源往往在国外国内网络环境下载经常卡死而且安装速度感人。我个人更推荐直接用离线解压包下载一个7z压缩包解压到你想要的目录配置好环境变量就完事卸载也干净——直接删文件夹。3. 下载MinGW-w64的正确姿势3.1 去哪里下载这里推荐几个下载源按可靠程度排序。首选是WinLibswinlibs.com这个项目专门提供MinGW-w64的自动构建版本GCCl版本跟进很勤快自带GDB调试器还额外编译了make和ninja省去你后面自己补工具的麻烦。唯一需要注意的是它提供了两个运行时版本msvcrt和ucrt。Win10/11上建议选ucrt性能更好对C99/C11支持更完整而且ucrt从Win10开始就是系统组件了不用额外分发。备选是w64devkitgithub.com/skeeto/w64devkit一个更加极简的版本压缩包更小还内置了Vim、Git等命令行工具适合喜欢在终端里完成一切操作的开发者。也可以直接去官方仓库的Release页面下载。不要用SourceForge上那个老的安装器版本太旧了很多新特性没有而且下载体验一言难尽。3.2 一个可以抄作业的下载选择如果你用的是64位Windows 10或11平时需要编译普通的C/C程序我建议你直接选WinLibs的ucrt版本具体命名类似Win64 - UCRT - LLVM/Clang/LLDB/LLD - MinGW-w64 - GCC架构选x86_64线程模型选posix异常处理选seh整个文件名翻译过来就是64位、UCRT运行时、posix线程模型、SEH异常处理。这个组合在兼容性和性能之间取了一个非常均衡的点这几年我用下来没有遇到过硬伤。3.3 解压到哪个目录比较好解压有个容易被忽略的原则路径不要有空格也不要有中文。虽然现在大部分工具都能处理带空格的路径但CMake、Makefile、各种脚本对路径的处理方式千奇百怪万一哪一步爆了你排查的时间远远超过你多花两分钟选个干净路径的时间。我习惯把工具链统一放在一个C:\dev\tools的目录下解压后你会得到一个类似C:\dev\tools\mingw64的文件夹。这个目录就是MinGW-w64的根目录里面会有bin、include、lib、libexec这些子文件夹。注意bin目录里面应该有gcc.exe、g.exe、gdb.exe、mingw32-make.exe这些可执行文件没有的话说明你解压错了层级。提示如果解压后找不到bin目录或者bin目录里没有gcc.exe多半是你把整个外层文件夹都解压进去了。MinGW-w64的包根目录特征很明显——直接包含bin、include、lib这些文件夹。你只需要让环境变量指向那个包含bin的根目录即可。4. 环境变量配置与验证MinGW-w64本身是一个“绿色软件”解压即用但它不会自动加入PATH你需要手动告诉系统去哪里找gcc.exe。这一步做不对后面命令行里输gcc就会提示“不是内部或外部命令”。4.1 手动配置PATHWindows 11下右键“此电脑” →“属性”→“高级系统设置”→“环境变量”。在“系统变量”里找到Path双击进去点“新建”添加你的MinGW-w64的bin目录路径比如C:\dev\tools\mingw64\bin。为什么加bin而不是加整个MinGW-w64根目录因为bin是存放可执行文件的地方Windows的可执行文件搜索机制就是扫描PATH里每个目录找这个目录下有没有对应用名的exe。你把根目录加进去系统在根目录找不到gcc依然没办法执行。配置完后注意一点如果你开着命令行窗口PATH不会自动刷新。你需要关掉所有cmd、PowerShell窗口重新开一个再验证。我见过很多人配完环境变量在同一个旧窗口里敲gcc依然报错就以为配置失败其实只是窗口没刷新。4.2 验证安装是否成功开一个新的cmd或PowerShell窗口依次执行下面几个命令gcc --version g --version gdb --version mingw32-make --version正常的输出应该包含类似gcc (MinGW-W64 x86_64-ucrt-posix-seh) 13.2.0这样的版本信息。如果前三条都正常说明编译器本体没问题mingw32-make是Windows版的GNU Make工具编译一些老项目会用到。再执行一条交叉验证命令echo | gcc -dM -E - | findstr /i WIN64 x86_64能输出_WIN64和__x86_64__宏定义说明这个编译器确实是64位目标。4.3 命令行里验证C标准支持确认编译器能跑之后顺手查一下支持的标准版本g -stdc17 -E -x c /dev/null 2nul echo C17 OK或者更直接一点写一个安安稳稳的小文件测试编译。命令行验证的主要目的是把“环境变量配置”和“编译本身”两件事解耦——环境变量对了命令就能跑编译能过说明工具链完整。分开排查思路更清晰。5. 用一个真实的小项目走通编译流程环境配置好之后最好写个像样的程序试试完整的编译链跑一遍你才能确认这不是一个“只能打印版本号”的假环境。5.1 写一个支持多线程的C程序下面这个例子我故意用到了C11的线程库为的是同时验证两件事基本编译能力以及前面选的posix线程模型是否工作正常。新建一个文件main.cpp内容如下#include iostream #include thread #include vector void worker(int id) { std::cout thread id running std::endl; } int main() { std::vectorstd::thread threads; for (int i 0; i 4; i) { threads.emplace_back(worker, i); } for (auto t : threads) { t.join(); } std::cout all threads done std::endl; return 0; }如果你当时选的是win32线程模型这个程序编译大概率会直接报错std::thread压根不可用。所以说下载时那个一步的选择影响真的很大。5.2 编译并运行在项目目录下打开命令行执行g -stdc17 -Wall -Wextra -O2 main.cpp -o main.exe-stdc17指定C标准版本-Wall -Wextra开启警告让编译器帮你找出潜在问题-O2开启优化-o main.exe指定输出文件名然后运行.\main.exe正常会看到4个线程的输出和最后的all threads done。如果这一步能过说明你的MinGW-w64安装基本完备日常编译需求都能满足了。我还建议你用同样的方式编译一个包含多个.cpp文件的项目试试比如把worker函数拆出去放到worker.cpp里再写个worker.h然后一条命令一起编译g -stdc17 main.cpp worker.cpp -o main.exe这样你能确认头文件搜索路径和单个编译单元的链接都没问题。5.3 调试器的使用验证有了GDB才能算完整的开发环境。写一个会崩溃的程序或者直接在GDB里设断点跑一遍gdb ./main.exe在GDB交互界面里敲break main然后run程序就会停在main函数入口处。按next单步执行print i查看变量值continue继续运行quit退出。GDB的Windows版本有时候会有一些终端兼容问题如果遇到莫名卡顿试试在GDB里先执行set pagination off。6. 再配一个Make工具make还是mingw32-makeGCC本身只是一个编译器它只负责把源代码变成目标文件和可执行文件。真正管理多文件编译、增量编译、自动化构建流程的是Make。MinGW-w64自带的make叫mingw32-make.exe和Linux上的make命令用法基本一致但可执行文件名不同。如果你只是写写小项目、单文件编译暂时用不上Make。但只要项目文件超过三五个手敲编译命令就完全不现实了。我建议直接用内置的mingw32-make在项目根目录写一个MakefileCXX g CXXFLAGS -stdc17 -Wall -Wextra -O2 TARGET main.exe SRCS main.cpp worker.cpp $(TARGET): $(SRCS) $(CXX) $(CXXFLAGS) $(SRCS) -o $(TARGET) clean: del $(TARGET) .PHONY: clean然后执行mingw32-make就能完成编译了。注意Windows上有多个make变体——MinGW自带的叫mingw32-make如果你装了MSYS2还有一个make命令还有Chocolatey装的GnuWin32 make不同版本之间行为有细微差异。最稳的做法项目里你就固定用mingw32-make别人要用的时候也明确告诉他们用哪个命令。如果你对各种工具链的命名差异感到头大有个更省心的选择直接装MSYS2。MSYS2是一个完整的类Unix环境包管理器pacman可以一条命令装GCCpacman -S mingw-w64-ucrt-x86_64-gcc装出来和WinLibs一样是UCRT版本而且版本更新更快、包更全。缺点是你得先适应pacman这套包管理思路。这篇文章主要讲MinGW-w64的解压即用方式MSYS2适合想进一步折腾的读者两条路并行不冲突。7. 常见问题与排查技巧实录这部分是我这些年实际遇到过的坑每一个都让我花过不少时间排查。整理出来你遇到可以直接对照处理。7.1 “gcc不是内部或外部命令”这是最常见的问题原因基本只有三个PATH没配或者配错了。重新检查环境变量里Path有没有C:\dev\tools\mingw64\bin注意是bin目录。改完环境变量没开新窗口。关掉当前cmd/PowerShell重新打开一个。解压目录选错了层级。确认C:\dev\tools\mingw64\bin\gcc.exe真实存在。快速验证路径是否正确可以在PowerShell里执行Get-Command gcc如果它能显示gcc.exe的完整路径说明PATH配置成功。7.2 编译时提示找不到头文件编译C程序时如果报错fatal error: iostream: No such file or directory说明GCC没找到标准库头文件。先检查你是不是把所有文件都放在一个叫include的目录下却忘了告诉编译器确认一下MinGW-w64目录结构是否正常根目录下应该有include和lib。如果目录结构正常但依然找不到可能是你在命令行里设置了错误的CPLUS_INCLUDE_PATH或C_INCLUDE_PATH环境变量把它清掉再试。7.3 链接时提示找不到某些系统库比如报错cannot find -lwinpthread。这种情况多是因为你的项目里用了-lwinpthread这样的参数但当前版本的MinGW-w64里这个库改名了或者合并进了其他库。先别急着怀疑环境坏了查一下你的C:\dev\tools\mingw64\lib目录下有没有对应的.a文件没有的话把链接参数去掉或者改成实际存在的库名。更高级的排查手法是给GCC加-v参数它会打印出完整的搜索路径和链接命令g -v main.cpp -o main.exe这样你能看到GCC实际搜索了哪些目录、使用了哪些库比盲猜快得多。7.4 编译出来的程序在别人电脑上无法运行MinGW-w64编译出的exe默认依赖一些Windows系统DLL比如libgcc_s_seh-1.dll、libstdc-6.dll、libwinpthread-1.dll如果对方电脑上没有这些DLL特别是Win7、Win8老系统程序会直接报错“找不到libstdc-6.dll”或者“无法启动此程序”。解决办法有三种静态链接。编译时加-static -static-libgcc -static-libstdc把库直接嵌进exe里文件会大一些但目标机器不用装任何依赖。把MinGW目录下的相关DLL一起拷贝到exe目录下。用像UPX这样的工具压缩同时解决体积和依赖问题但有些杀软会误报。我通常的做法是如果程序要给别人用直接静态链接省得一堆DLL拷来拷去。7.5 PowerShell执行编译命令权限问题有时候在PowerShell里执行gcc会提示“无法加载文件或者程序集”这是因为PowerShell的执行策略限制了脚本运行但不影响exe直接执行。如果你遇到奇怪的PowerShell报错先用cmd试一下能跑说明编译器没问题问题出在终端环境配置上。7.6 和Visual Studio的C项目共存一台机器同时装VS和MinGW-w64是完全没问题的它们各自维护自己的编译链。但要注意的是VS的命令行工具cl.exe和MinGW的文件名不冲突可搜索路径里如果既有VS的工具又有MinGW的gcc你在命令行里输cl会调用VS的编译器输gcc会调用MinGW的编译器各干各的。麻烦的是如果你用CMake生成项目CMake默认找的编译器顺序可能会造成版本混乱。建议在CMake配置时明确指定编译器cmake -G MinGW Makefiles -DCMAKE_C_COMPILERgcc -DCMAKE_CXX_COMPILERg8. 额外推荐顺手把VS Code也配好既然你已经有了命令行工具链下一步自然是配一个编辑器。我不太推荐新手直接用Vim或Emacs折腾VS Code是绝大多数人最顺滑的选择免费、轻量、插件生态成熟而且对MinGW-w64的支持几乎是开箱即用的。装好VS Code之后安装C/C扩展由Microsoft发布。然后新建一个工作目录写好C代码按CtrlShiftB它会提示你配置构建任务。选择“C/C: g.exe 生成活动文件”VS Code会自动生成一个.vscode/tasks.json里面写好了编译命令。之后每次按CtrlShiftB就能一键编译F5能直接启动调试。关于tasks.json有一个值得注意的细节自动生成的编译命令默认不带-stdc17这类参数如果代码用了新标准特性会编译失败。你需要手动在tasks.json里的args数组中加上args: [ -fdiagnostics-coloralways, -g, -stdc17, ${file}, -o, ${fileDirname}\\${fileBasenameNoExtension}.exe ]-g参数生成调试信息F5调试必须依赖它。再配一个c_cpp_properties.json告诉VS Code你的编译器和标准{ configurations: [ { name: Win64, includePath: [${workspaceFolder}/**, C:/dev/tools/mingw64/include/**], defines: [_DEBUG, UNICODE, _UNICODE], compilerPath: C:/dev/tools/mingw64/bin/gcc.exe, cStandard: c17, cppStandard: c17, intelliSenseMode: windows-gcc-x64 } ], version: 4 }这样写之后VS Code的语法提示、跳转、自动补全就全部基于你真实使用的MinGW-w64了不会再出现“VS Code编译能过但代码一路标红”的诡异问题。9. 我看过无数教程最后还是踩过的几个坑最后来点掏心窝的经验总结都是我在实际项目中一步步踩出来的分享出来供参考。第一下载MinGW-w64别贪图“最新”。除非你有明确的需求要尝鲜新版本GCC比如要测试C23某个新特性否则选上一个稳定版本即可。工具链的稳定性远比版本号有面子重要。WinLibs和官方仓库都会保留历史版本找Release列表往下翻一点就能看到。第二线程模型能选posix就选posix这不是偏执。很多第三方库特别是Boost、Qt、OpenCV这些大块头在Windows上用sched_yield、pthread接口做平台抽象你要是win32模型轻则编译不过重则链接期报一堆undefined reference。犯不上为了一点性能差异去冒这个险。第三解压了MinGW-w64之后第一件事不是编译Hello World而是先跑一遍GDB。我遇到过几次情况编译器装好了编译正常但GDB一跑就报“Could not find version of Cygwin DLL”或者直接闪退。事后再补GDB麻烦得很不如一开始就验证完整。第四别把MinGW-w64目录放在需要管理员权限才能写入的位置比如C:\Program Files。MinGW-w64虽然日常编译不需要管理员权限但如果你用pacman在MSYS2环境下或者某些包管理器往里面装依赖普通权限根本写不进去找半天原因才发现是权限卡住了。第五想清楚你到底需要哪个构建系统。是只用GCC干编译还是后面要接CMake、Ninja、Makefile。如果确定要搞CMake建议把WinLibs里自带的make和ninja都留着CMake生成构建系统的时候可用的生成器多一个路就好走一分。10. 结合个人习惯整理的最终推荐安装组合如果你看完前面所有内容觉得信息量太大不知道怎么选那就按下面这套最省心的方案走下载WinLibs的Win64 - UCRT - MinGW-w64 - GCC版本解压到C:\dev\tools\mingw64把C:\dev\tools\mingw64\bin加入系统PATH新开命令行运行gcc --version验证写一个main.cpp测试std::thread编译有需要的话再配好make和VS Code这一套下来你在Windows上就拥有了一套完整的、不输Linux开发体验的GCC工具链。后面不管你是想编译开源项目、做算法竞赛、写Qt应用还是搞嵌入式开发这套环境都能扛住。我自己时至今日日常写C还是用这套组合VS Code配MinGW-w64简单、干净、可控性强没有VS那样动不动几GB的臃肿感。工具链这东西适合自己工作流的才是最好的。希望这篇长文能帮你少走几步弯路。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询