必须使用msys2 ucrt64或mingw64终端安装gcc,不可用msys2 msys终端;ucrt64路径为c:msys64ucrt64in,推荐新项目首选;安装命令需匹配终端前缀,如ucrt64中执行pacman -s mingw-w64-ucrt-x86_64-gcc;验证须编译运行test.c,仅gcc --version不足以确认链路完整。

必须用对终端:MINGW64 或 UCRT64,别开错
MSYS2 安装 GCC 不是随便打开一个终端就能装的。你看到的「MSYS2 MSYS」「MSYS2 MINGW64」「MSYS2 UCRT64」三个入口,只有后两个能装出真正可用的 Windows 原生 GCC。
关键区别:
-
MINGW64对应传统 MinGW-w64 工具链,路径是C:msys64mingw64in -
UCRT64使用微软通用 C 运行时(UCRT),兼容性更好,路径是C:msys64ucrt64in,推荐新项目首选 - 千万别在
MSYS2 MSYS终端里执行pacman -S mingw-w64-x86_64-gcc——它会装错环境,编译出的程序可能无法运行或链接失败
安装命令要匹配终端类型,不能混用包名
你在哪个终端里操作,就得用对应前缀的包名,否则 pacman 会找不到包,或者装到错误环境里。
正确做法:
- 在
MSYS2 MINGW64终端中运行:pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-gdb mingw-w64-x86_64-make - 在
MSYS2 UCRT64终端中运行:pacman -S mingw-w64-ucrt-x86_64-gcc mingw-w64-ucrt-x86_64-gdb mingw-w64-ucrt-x86_64-make - 想一步装全工具链(含
cmake、ninja等):pacman -S --needed mingw-w64-ucrt-x86_64-toolchain - 如果提示「no packages to install」,先执行
pacman -Syu更新仓库索引(关掉终端重开一次再执行)
验证时别只跑 gcc --version,要测实际编译
输出版本号只是说明命令能调起,不代表能真正编译链接。很多用户卡在「能查版本但编译时报 ld: cannot find -lstdc++」这类错误,本质是环境没对齐。
建议立刻验证的最小闭环:
- 新建
test.c:#include <stdio.h> int main(){printf("ok\n");return 0;}</stdio.h> - 执行:
gcc test.c -o test.exe && ./test.exe - 如果输出
ok,说明 GCC + linker + runtime 全链路通了 - 若报错
cannot find -lmsvcrt或undefined reference to `__imp___acrt_iob_func',大概率是你在 MSYS 终端装了 MINGW 包,或者 PATH 混入了错误的 bin 目录
加到系统 PATH 是个高危操作,顺序和路径必须精准
让 CMD/PowerShell/VS Code 调用 GCC,确实要加 PATH,但顺序错了就会覆盖或冲突。
必须做到:
- 只添加对应终端的
bin目录:C:msys64ucrt64in(UCRT64)或C:msys64mingw64in(MINGW64) - 绝对不要加
C:msys64usrin(这是 MSYS 环境,工具行为不一致) - 在系统环境变量
Path编辑界面里,把该路径「上移」到最顶部,确保优先于其他可能存在的gcc(比如旧版 MinGW、WSL 的路径) - 加完后重启所有已打开的 CMD/PowerShell/VS Code,否则缓存仍用旧 PATH
最常被忽略的一点:MSYS2 默认不自动更新包索引,pacman -Syu 必须成功执行两次(中间重启终端),否则后续安装可能因元数据过期而失败。











