vs的cl.exe 编译器 c++20 基本配置
把 Windows 下的 cl.exe(MSVC)配置成 C++20 工具链,包括安装、环境配置、命令行编译、VSCode 集成和常见坑。全程只讲 MSVC,不掺杂 MinGW。
一、先确认:cl.exe 支持 C++20 的最低版本
- VS 2019 16.11+(MSVC 14.29+):基本完整支持 C++20
- VS 2022(MSVC 14.30+):推荐,C++20 支持最完善
建议直接装 Visual Studio 2022 Build Tools(轻量)或 Community(完整)。
二、安装 MSVC 工具链(必须)
方式 A:只装编译工具(推荐,轻量)
- 官网下载:Visual Studio Installer
- 选择 “桌面开发 with C++”(Desktop development with C++)
- 勾选至少:
- MSVC v143 生成工具(或更高)
- Windows SDK(如 Windows 11 SDK)
- C++ CMake 工具(可选)
方式 B:已装 VS,补组件
- 打开 Visual Studio Installer → 修改 → 确保上面三个勾选。
三、找到 cl.exe 路径(关键)
默认路径(VS2022):
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\bin\Hostx64\x64
14.38.xxxx是你的实际版本号Hostx64\x64= 64位编译器编译64位程序(日常开发首选)
四、配置环境变量
方法 1:临时生效(每次开终端都要做,最简单)
用 VS 开发者命令提示符:
- 开始菜单 → 搜索:x64 Native Tools Command Prompt for VS 2022
- 打开后直接输入:
cl /std:c++20
就可以编译 C++20 了,不用自己配环境变量。
方法 2:永久配置(全局可用,推荐)
需要配置 PATH、INCLUDE、LIB 三个变量。
1)PATH(让系统找到 cl.exe)
添加:
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\bin\Hostx64\x64
2)INCLUDE(头文件路径,系统变量里没有就新建)
新建/追加:
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\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\um;
C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\shared
3)LIB(库文件路径,没有就新建)
新建/追加:
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\lib\x64;
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\ucrt\x64;
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\um\x64
路径中的 10.0.22621.0 换成你机器上实际的 SDK 版本号。
配完重启终端,输入:
cl /?
能看到帮助即成功。
五、命令行编译 C++20(核心参数)
必带参数
/std:c++20 // 启用 C++20
/EHsc // 启用标准 C++ 异常处理(几乎必加)
示例:单文件编译(C++20)
// main.cpp
#include <iostream>
#include <ranges> // C++20
int main() {
auto nums = {1,2,3,4,5};
for (auto n : nums | std::views::reverse) {
std::cout << n << ' ';
}
return 0;
}
编译命令:
cl /EHsc /std:c++20 main.cpp
生成:main.obj + main.exe,直接运行即可。
常用扩展参数
/O2 // 发布版优化(速度优先)
/Od // 调试版(关闭优化)
/Zi // 生成调试信息(.pdb)
/W4 // 最高警告级别
/WX // 警告视为错误(严谨)
/Fe:myapp.exe // 指定输出文件名
发布版示例:
cl /EHsc /std:c++20 /O2 /W4 main.cpp /Fe:myapp.exe
介绍 INCLUDE, LIB添加的目录
结合 MSVC 工具链、Windows SDK 架构,逐段拆解 INCLUDE(头文件目录)、LIB(库文件目录) 里每一条路径的作用,同时讲清整体逻辑、组件归属和运行原理,适配你之前配置的 cl.exe + C++20 环境。
一、前置基础概念
-
INCLUDE 环境变量
编译器cl.exe编译阶段,查找.h/.hpp头文件的搜索路径。
代码里#include <xxx>会按INCLUDE目录顺序依次检索,找不到直接报fatal error C1004 / C1083: 无法打开包括文件。 -
LIB 环境变量
链接器link.exe(cl 内部调用)链接阶段,查找静态库/导入库.lib的搜索路径。
用于解析函数、类、系统 API 的符号引用,找不到库会报LNK1104 无法打开 xxx.lib、LNK2019 无法解析的外部符号。 -
两大组件来源
- MSVC 自身库/头:C/C++ 标准库、编译器内置扩展、STL(C++20 ranges/concepts 等都在这里)
- Windows SDK:Windows 系统原生 API、运行时、系统头文件与系统库(Win32 API、注册表、窗口、文件、网络等)
二、逐条解析 INCLUDE 目录(头文件路径)
1. MSVC 编译器标准头目录
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include
用途
这是 MSVC 核心头文件根目录,重中之重,C++20 完全依赖这里:
- C 标准库头文件:
stdio.h、string.h、stdlib.h、stddef.h等; - C++ 标准库 & STL:
iostream、vector、ranges、concepts、format、<module>(C++20 模块)等全部新标准组件;你测试
std::views、C++20 特性,必须依赖此目录,缺失直接编译失败。 - MSVC 编译器扩展头:
vadefs.h、crtdefs.h、编译器内置宏、类型定义; - 异常、RTTI、内存分配相关内置声明。
没有这个目录 → 所有
#include <>标准头全部找不到,编译直接报错。
2. Windows SDK - ucrt 目录
C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\ucrt
ucrt = Universal C Runtime(通用 C 运行时)
用途
Windows 现代 C 运行时头文件,取代了老旧的 msvcrt:
- 提供跨 Windows 版本兼容的 C 标准运行时声明:文件操作、字符串、格式化、内存管理、时间、数学函数等;
- 区分于 MSVC 自带标准库,这是系统层面的 C 运行时接口;
- 所有控制台程序、读写文件、
printf/scanf、malloc/free底层都依赖此处头文件; - C++ 标准库内部也会间接调用 UCRT,缺失会导致标准库函数声明缺失。
3. Windows SDK - um 目录
C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\um
um = User Mode(用户模式)
用途
Win32 传统 Windows API 头文件主目录,Windows 桌面编程核心:
- 窗口、消息、控件:
windows.h、winuser.h、wingdi.h(GDI 图形); - 文件、进程、线程、注册表、服务:
winbase.h、winreg.h; - 网络、套接字:
winsock2.h; - 系统权限、Shell、对话框、菜单等全部 Windows 原生接口。
只写纯标准 C++(控制台、算法、STL)可以暂时不用;
一旦写 Windows 窗口、GUI、系统调用,必须要有这个目录。
4. Windows SDK - shared 目录
C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\shared
用途
Windows 通用共享基础头文件,被 um、内核组件、驱动、系统组件共用:
- 基础数据类型、结构体、宏、错误码定义:
winnt.h、ntdef.h、winerror.h; - 系统通用常量、版本定义、句柄类型;
- 很多
um下的 API 头文件会#include这里的文件,属于依赖前置目录。
典型报错:缺少此目录 →
DWORD、HANDLE、BOOL等 Windows 基础类型未定义。
三、逐条解析 LIB 目录(库文件路径)
LIB 路径对应编译后的二进制库文件,分 MSVC 标准库 和 Windows 系统库,且区分 x64/x86(当前配置为 64 位)。
1. MSVC 标准库目录 x64
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\lib\x64
用途
MSVC 编译出来的 C/C++ 标准库、STL 库、运行时库(.lib),C++20 核心依赖:
- C++ 标准库静态/导入库:
libcpmt.lib、libcp.lib、msvcprt.lib- 负责
std::iostream、容器、算法、C++20 ranges/concepts/format 等所有 STL 实现; - 缺失 → 报
LNK1104 无法打开 libcpmt.lib、LNK2019 无法解析 std::xxx。
- 负责
- C 运行时库:
libcmt.lib、msvcrtd.lib(调试版); - 异常处理、RTTI、动态内存、C++ 类构造析构的底层实现库;
- 编译器辅助库、安全检查库(
gsupport.lib等)。
纯 C++20 控制台程序,最核心就是这个目录,缺一不可。
2. Windows SDK - ucrt\x64
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\ucrt\x64
用途
UCRT(通用 C 运行时)对应的 系统运行时库文件:
- 对应上面
ucrt头文件的实现,printf、fopen、strcpy、数学函数等底层实现; - 负责程序启动、入口函数
main前置初始化、堆管理、标准流(stdin/stdout/stderr); - 区分 64 位/32 位,这里
x64专门给 64 位程序使用; - 缺失 → 链接阶段直接报 C 运行时函数未解析。
3. Windows SDK - um\x64
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\um\x64
用途
Win32 API 对应的 系统导入库,配合 um 头文件使用:
- 窗口、图形库:
user32.lib、gdi32.lib; - 文件/进程/基础系统库:
kernel32.lib(几乎所有 Windows 程序都隐式依赖); - 网络、注册表、Shell、多媒体等各类系统 API 库;
- 这些是导入库(不是静态库),作用是引导程序运行时加载系统
dll。
写普通 C++ 控制台程序,
kernel32.lib是系统默认隐式链接,一般不会报错;
一旦手动调用 Windows API、写窗口程序,缺少此目录会大量报外部符号错误。
四、整体层级与加载顺序(帮你理解整套工具链)
编译阶段(cl.exe → 读 INCLUDE)
- 优先找 MSVC include → 解析 C++20 STL、标准头
- 再找 UCRT include → 解析 C 运行时函数声明
- 再找 shared + um → 解析 Windows 类型、Win32 API
链接阶段(link.exe → 读 LIB)
- 优先 MSVC lib\x64 → 链接 C++ STL、标准库实现
- UCRT lib\x64 → 链接 C 运行时实现
- um lib\x64 → 链接 Windows 系统 API 库
五、场景精简建议(按需取舍)
根据你的使用场景,可以精简目录,不用全加:
-
只写纯标准 C/C++ / C++20 控制台(无 Windows API)
- INCLUDE:保留
MSVC include+ucrt - LIB:保留
MSVC lib\x64+ucrt\x64
→ 去掉shared、um也能正常编译运行。
- INCLUDE:保留
-
做 Windows 桌面/GUI/系统编程
- 必须保留 全部 4 个 INCLUDE + 全部 3 个 LIB。
六、常见报错对应目录缺失对照表
| 报错现象 | 缺失目录 |
|---|---|
找不到 <iostream>/<ranges> |
MSVC 主 include / MSVC lib |
DWORD/HANDLE 未定义 |
Windows SDK shared |
找不到 windows.h |
Windows SDK um |
LNK1104 无法打开 libcpmt.lib |
MSVC lib\x64 |
printf/fopen 未解析 |
UCRT include 或 UCRT lib |
| Win32 函数(CreateWindow)未解析 | um\x64 库目录 |

浙公网安备 33010602011771号