




















把 Windows 下的 cl.exe(MSVC)配置成 C++20 工具链,包括安装、环境配置、命令行编译、VSCode 集成和常见坑。全程只讲 MSVC,不掺杂 MinGW。
建议直接装 Visual Studio 2022 Build Tools(轻量)或 Community(完整)。
默认路径(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位程序(日常开发首选)用 VS 开发者命令提示符:
cl /std:c++20
就可以编译 C++20 了,不用自己配环境变量。
需要配置 PATH、INCLUDE、LIB 三个变量。
添加:
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\bin\Hostx64\x64
新建/追加:
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
新建/追加:
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 /?
能看到帮助即成功。
/std:c++20 // 启用 C++20
/EHsc // 启用标准 C++ 异常处理(几乎必加)
// 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
结合 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 无法解析的外部符号。
两大组件来源
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include
这是 MSVC 核心头文件根目录,重中之重,C++20 完全依赖这里:
stdio.h、string.h、stdlib.h、stddef.h 等;iostream、vector、ranges、concepts、format、<module>(C++20 模块)等全部新标准组件;
你测试
std::views、C++20 特性,必须依赖此目录,缺失直接编译失败。
vadefs.h、crtdefs.h、编译器内置宏、类型定义;没有这个目录 → 所有
#include <>标准头全部找不到,编译直接报错。
C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\ucrt
ucrt = Universal C Runtime(通用 C 运行时)
Windows 现代 C 运行时头文件,取代了老旧的 msvcrt:
printf/scanf、malloc/free 底层都依赖此处头文件;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;只写纯标准 C++(控制台、算法、STL)可以暂时不用;
一旦写 Windows 窗口、GUI、系统调用,必须要有这个目录。
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 路径对应编译后的二进制库文件,分 MSVC 标准库 和 Windows 系统库,且区分 x64/x86(当前配置为 64 位)。
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\lib\x64
MSVC 编译出来的 C/C++ 标准库、STL 库、运行时库(.lib),C++20 核心依赖:
libcpmt.lib、libcp.lib、msvcprt.lib
std::iostream、容器、算法、C++20 ranges/concepts/format 等所有 STL 实现;LNK1104 无法打开 libcpmt.lib、LNK2019 无法解析 std::xxx。libcmt.lib、msvcrtd.lib(调试版);gsupport.lib 等)。纯 C++20 控制台程序,最核心就是这个目录,缺一不可。
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\ucrt\x64
UCRT(通用 C 运行时)对应的 系统运行时库文件:
ucrt 头文件的实现,printf、fopen、strcpy、数学函数等底层实现;main 前置初始化、堆管理、标准流(stdin/stdout/stderr);x64 专门给 64 位程序使用;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\um\x64
Win32 API 对应的 系统导入库,配合 um 头文件使用:
user32.lib、gdi32.lib;kernel32.lib(几乎所有 Windows 程序都隐式依赖);dll。写普通 C++ 控制台程序,
kernel32.lib是系统默认隐式链接,一般不会报错;
一旦手动调用 Windows API、写窗口程序,缺少此目录会大量报外部符号错误。
根据你的使用场景,可以精简目录,不用全加:
只写纯标准 C/C++ / C++20 控制台(无 Windows API)
MSVC include + ucrtMSVC lib\x64 + ucrt\x64shared、um 也能正常编译运行。做 Windows 桌面/GUI/系统编程
| 报错现象 | 缺失目录 |
|---|---|
找不到 <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 库目录 |
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。