必须安装Visual Studio 2022 Community并勾选“Desktop development with C++”工作负载,以获取cl.exe、link.exe、Windows SDK及完整头文件;不可仅装Build Tools或MinGW。

需要安装哪些 C++ 工具链
VS Code 本身不带编译器,开发 Win32 项目必须手动配好 Windows 下的原生 C++ 构建环境。只装 VS Code 是跑不起来 WinMain 的。
推荐直接安装 Visual Studio 2022 Community(免费),勾选 Desktop development with C++ 工作负载——它会一并装好 cl.exe、link.exe、Windows SDK 和 winuser.h 等头文件。别试图只装 Build Tools,缺头文件或 SDK 版本不匹配时,#include <windows.h> 会直接报错找不到。
- 确认
cl.exe能在终端里调用:打开 VS 开发人员命令提示符,运行cl应该输出版本信息 - 不要用 MinGW 编 Win32 GUI 程序——默认不链接
user32.lib和gdi32.lib,RegisterClassExW或CreateWindowExW会报 LNK2019 - 检查
$(WindowsSdkDir)环境变量是否已设置,VS Code 的c_cpp_properties.json里includePath需要它
c_cpp_properties.json 怎么写才不爆红
IntelliSense 报红不是代码错,而是路径没对上。重点不是“加一堆路径”,而是让 includePath 和 defines 与实际构建环境严格一致。
最简可用配置(以 VS 2022 + Windows 10 SDK 10.0.22621.0 为例):
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**",
"C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/*/include",
"C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/*/atlmfc/include",
"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/ucrt",
"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/shared",
"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/um",
"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/winrt"
],
"defines": ["_UNICODE", "UNICODE", "_CRT_SECURE_NO_WARNINGS"],
"compilerPath": "cl.exe",
"cStandard": "c17",
"cppStandard": "c++17",
"intelliSenseMode": "windows-msvc-x64"
}
],
"version": 4
}
-
intelliSenseMode必须是windows-msvc-x64(或x86),不能写clang-x64,否则宏定义和类型推导全乱 -
defines里漏掉UNICODE,TEXT("hello")就会展开成 ASCII 版本,和L"hello"行为不一致 - 路径里的 SDK 版本号(如
10.0.22621.0)必须和你机器上真实安装的一致,错一位就找不到windows.h
tasks.json 编译 Win32 程序的关键参数
VS Code 的 tasks.json 不是写个 cl main.cpp 就完事。Win32 GUI 程序必须显式指定子系统、入口函数和依赖库,否则生成的 exe 一闪而退或启动失败。
一个能跑起来的最小 cl 命令长这样:
cl /EHsc /W4 /D_UNICODE /DUNICODE main.cpp /link user32.lib gdi32.lib shell32.lib /SUBSYSTEM:WINDOWS /ENTRY:wWinMainCRTStartup
-
/SUBSYSTEM:WINDOWS是关键——没有它,控制台窗口会强制弹出;有它,才能隐藏黑框跑纯 GUI -
/ENTRY:wWinMainCRTStartup告诉链接器用宽字符版入口,和int wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int)匹配;写成WinMain会链接失败 - 缺
user32.lib,RegisterClassExW报 LNK2019;缺shell32.lib,ShellExecuteW同样挂 -
/EHsc启用 C++ 异常处理,Win32 API 调用中抛异常时不至于直接崩溃
调试时看不到窗口?检查 launch.json 的 console 设置
VS Code 默认用 console: "integratedTerminal" 启动程序,这对 Win32 GUI 程序是灾难——它会把 GUI 窗口绑定到终端进程上,调试中断后窗口直接消失。
- 必须设
"console": "externalTerminal",或者更稳妥地删掉这一行(默认行为是创建独立进程) -
"stopAtEntry": true别乱开——Win32 程序入口是wWinMain,但调试器可能停在 CRT 初始化代码里,看起来像卡死 - 如果断点进不去
wWinMain,检查targetArchitecture是否和编译目标一致(x64 项目配 x64 调试器,混用必失败) - 修改代码后按 Ctrl+F5 重新编译运行前,确认上一个进程已退出——Windows 不允许同名 exe 多次加载,否则调试器连不上











