在 VS Code 里写 C/C++:Windows + WSL2 双环境搭建指南
2026/6/25 14:22:37 网站建设 项目流程

在 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.hCreateProcess)也跑不起来。

比较高效的做法是: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.hsys/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-gccmingw-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-w64GCC 的 Windows 移植版
ucrt使用 Universal C Runtime
x86_6464 位架构
gccGNU C/C++ 编译器

安装完成后,编译器位于C:\msys64\ucrt64\bin\gcc.exe

第三步:添加 PATH 环境变量

  1. Win + S搜索"环境变量",打开"编辑系统环境变量"
  2. 点"环境变量",在用户变量中选中Path,点"编辑"
  3. 点"新建",填入C:\msys64\ucrt64\bin
  4. 确定保存

注意两点:

  • 添加的是目录路径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_64gcc之间加了空格,pacman 会把它当成两个包,第一个不存在就报target not found

Linux 侧:WSL2 + GCC

前提:WSL2 已安装

如果还没装 WSL2,在管理员 PowerShell 里执行:

wsl--install

安装完重启,会自动装好 Ubuntu。

安装编译器

打开 WSL 终端(或在 PowerShell 里执行wsl),运行:

sudoaptupdate&&sudoaptinstall-ybuild-essential

build-essential是一个元包,包含:

  • gcc/g++— C/C++ 编译器
  • make— 构建工具
  • libc6-dev— C 标准库开发头文件

装完后pthread.hsemaphore.hsys/ipc.hsys/shm.hunistd.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 代码为什么不能用同一个编译器编译。理清这些概念之后,剩下的就是敲命令的事。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询