在 Windows 上写 C/C++,大多数刚刚开始接触计算机的学生或者是平时不咋写c/cpp的人的第一反应是装个 Dev-C++ 或者 Visual Studio(vs2022可能很多初接触计算机的大学生会在网上看到推荐,不过现在可能都是vs 2026了哈哈,dev-c++更是经典,各种算法比赛的指定编译器和大一初次接触c语言学校电脑装的编译器),但如果你写的代码涉及fork()、pthread_create()这类 POSIX 接口,Windows 原生编译器是编译不过的——这些是 Linux 系统调用,Windows 根本没有对应的实现。
反过来,如果你只装了 WSL 里的 GCC,写 Windows API(windows.h、CreateProcess)也跑不起来。
比较高效的做法是:Windows 侧装 MinGW GCC 处理原生代码,WSL2 侧装 GCC 处理 POSIX 代码,VS Code 作为统一编辑器,两边都能编译调试。
这篇文章记录从零开始搭建这套环境的完整路径,以及过程中容易搞混的几个概念。
动手之前要理清的几个概念
POSIX 和 Windows 是两套体系
POSIX 是一套 Unix/Linux 系统 API 标准。fork()创建进程、pthread管理线程、semaphore.h做同步、sys/ipc.h做进程间通信——这些接口只存在于 Linux/Unix 系统中。Windows 有自己的一套:CreateProcess创建进程、CreateThread创建线程、CreateSemaphore做同步。
两套代码不能交叉编译。写 POSIX 代码必须有 Linux 编译环境,写 Windows API 代码必须有 Windows 编译器。
Dev-C++ 的局限
Dev-C++ 内置的编译器是 MinGW GCC,能编译标准 C/C++ 和 Windows API 代码。但它不带 POSIX 头文件,pthread.h、sys/ipc.h这些会直接报找不到。如果你只写 Windows 侧的代码,Dev-C++ 够用;如果还要写 POSIX 代码,它解决不了问题。
EasyX 是什么
EasyX 是一个 Windows 图形库,封装了initgraph()、circle()、setfillcolor()这些函数,让 C 程序能画窗口、画图形。它主要在国内高校教学中使用,是对 Turbo C 时代graphics.h的现代替代。
EasyX 只支持 Visual Studio 和 Dev-C++,不支持 MinGW 命令行编译。如果你的项目不需要图形界面,完全用不到它。即使需要,也建议先确认有没有更通用的替代方案(比如 SDL)。
MSYS2、MinGW、pacman 的关系
这是最容易被绕晕的一组概念。简单说:
MSYS2 安装器 + 包管理环境(类比:一个应用商店) | +-- pacman 包管理器,负责下载安装软件(类比:apt) | +-- MinGW-w64 通过 pacman 安装的 GCC 工具链(类比:gcc 软件包) | +-- gcc / g++ / gdb 编译器本体MSYS2 本身不带编译器。装完 MSYS2 你得到的是一个终端和 pacman 这个包管理器。需要用 pacman 执行一条安装命令,才会把 gcc 下载到本地。
打个比方:MSYS2 是 Steam,pacman 是 Steam 的下载功能,MinGW GCC 是你要下载的游戏。装了 Steam 不代表你有游戏,还得点"安装"。
ucrt 和 msvcrt 的区别
在 MSYS2 里装 gcc 时,会看到两个版本前缀:mingw-w64-ucrt-x86_64-gcc和mingw-w64-x86_64-gcc。区别在于 C 运行时库:
- ucrt(Universal C Runtime):Windows 10 自带的新版运行时,和 Visual Studio 用的是同一套
- msvcrt(Microsoft Visual C Runtime):老版运行时,兼容性更广但功能较旧
新项目选 ucrt 就对了。
Windows 侧:安装 MinGW GCC
第一步:安装 MSYS2
从 msys2.org 下载安装包,安装到默认路径C:\msys64。安装完成后会弹出 MSYS2 MSYS 终端。
第二步:用 pacman 安装 gcc
在 MSYS2 MSYS 终端中输入:
pacman-Smingw-w64-ucrt-x86_64-gcc注意终端类型:管理软件包要用MSYS2 MSYS终端,不要选 UCRT64 终端。UCRT64 终端是用来使用编译器的,不是用来安装编译器的。
包名各段含义:
| 片段 | 意思 |
|---|---|
| mingw-w64 | GCC 的 Windows 移植版 |
| ucrt | 使用 Universal C Runtime |
| x86_64 | 64 位架构 |
| gcc | GNU C/C++ 编译器 |
安装完成后,编译器位于C:\msys64\ucrt64\bin\gcc.exe。
第三步:添加 PATH 环境变量
Win + S搜索"环境变量",打开"编辑系统环境变量"- 点"环境变量",在用户变量中选中
Path,点"编辑" - 点"新建",填入
C:\msys64\ucrt64\bin - 确定保存
注意两点:
- 添加的是目录路径
C:\msys64\ucrt64\bin,不是C:\msys64\ucrt64\bin\gcc.exe。PATH 的工作方式是系统在目录下找可执行文件,不需要指定到具体.exe - 用户变量就够了,不用动系统变量
第四步:验证
新开一个cmd 或 PowerShell 窗口(旧窗口读不到新的 PATH),输入:
gcc --version能看到版本号即安装成功。
踩坑记录
终端选错:MSYS2 安装后在开始菜单里有好几个入口——MSYS2 MSYS、MSYS2 UCRT64、MSYS2 MINGW64 等。pacman 命令只能在 MSYS2 MSYS 终端里用,UCRT64 终端里会报command not found。两者的分工是:MSYS 管理软件包,UCRT64 使用编译器。
包名粘贴带乱码:从网页或聊天工具复制命令到终端时,可能带入不可见的 Unicode 字符。终端会把这些字符当成命令名的一部分,报command not found。遇到这种情况,手打一遍就行。
包名中间的空格:mingw-w64-ucrt-x86_64-gcc是一个完整的包名。如果在x86_64和gcc之间加了空格,pacman 会把它当成两个包,第一个不存在就报target not found。
Linux 侧:WSL2 + GCC
前提:WSL2 已安装
如果还没装 WSL2,在管理员 PowerShell 里执行:
wsl--install安装完重启,会自动装好 Ubuntu。
安装编译器
打开 WSL 终端(或在 PowerShell 里执行wsl),运行:
sudoaptupdate&&sudoaptinstall-ybuild-essentialbuild-essential是一个元包,包含:
gcc/g++— C/C++ 编译器make— 构建工具libc6-dev— C 标准库开发头文件
装完后pthread.h、semaphore.h、sys/ipc.h、sys/shm.h、unistd.h等 POSIX 头文件全部可用,不需要额外安装任何东西。
验证
gcc--version编译 POSIX 代码
涉及多线程的代码需要链接 pthread 库:
gcc program.c-oprogram-lpthread不加-lpthread会报undefined reference to pthread_create之类的链接错误。
VS Code 插件配置
C/C++ 插件
在 VS Code 扩展面板(Ctrl+Shift+X)搜索 “C/C++”,安装微软官方的那个。
它的作用:
- 语法高亮(没有它
.c文件是纯白文本) - 代码补全和智能提示
- 红色波浪线标记编译错误
- F5 一键调试
WSL 插件
搜索 “WSL”,安装微软官方的 WSL 扩展。
不装这个插件也能在 VS Code 终端里手动切到 WSL shell 执行编译,但体验是割裂的:
| 不装 WSL 插件 | 装 WSL 插件 | |
|---|---|---|
| 文件浏览器 | 看 Windows 文件 | 看 WSL 里的 Linux 文件 |
| IntelliSense | 用 MinGW 的 gcc 分析代码 | 用 WSL 的 gcc 分析代码 |
| 调试器 | 跑在 Windows 上 | 跑在 WSL 里 |
写fork()报红线吗 | 报,因为 MinGW 没有 | 不报,WSL gcc 认识 |
装了之后,VS Code 左下角会出现绿色图标,点"在 WSL 中重新打开",整个编辑器就切换到 Linux 模式。IntelliSense、调试器、终端全部基于 WSL 的 gcc,信息一致。
关于 VC6.0
有些教程会推荐 VC6.0(Visual C++ 6.0,1998 年的软件)作为 C/C++ 入门 IDE。网上还有各种"免安装绿色版"。
几个事实:
- "免安装"只意味着跳过了 setup 向导,运行时仍然会往注册表写入 COM 组件注册、文件关联等信息
- VC6.0 的编译器对 C99 标准支持不完整,变量必须在函数开头声明、
//单行注释可能报错 - 它的调试器、代码补全功能和 VS Code + C/C++ 插件相比,差了一个时代
MinGW GCC 支持最新的 C/C++ 标准,命令行编译简洁直接。配合 VS Code 后,编辑、补全、调试的体验远好于 VC6.0。不值得花时间在二十年前的工具上。
总结
整个环境搭建可以压缩为三步:
- WSL 里一条命令:
sudo apt install -build-essential - MSYS2 里一条命令:
pacman -S mingw-w64-ucrt-x86_64-gcc,再加一条 PATH - VS Code 装两个插件:C/C++ 和 WSL
真正容易卡住的不是操作步骤,而是搞清楚 MSYS2、MinGW、pacman 之间的关系,以及 POSIX 代码和 Windows API 代码为什么不能用同一个编译器编译。理清这些概念之后,剩下的就是敲命令的事。