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:只装编译工具(推荐,轻量)

  1. 官网下载:Visual Studio Installer
  2. 选择 “桌面开发 with C++”(Desktop development with C++)
  3. 勾选至少:
    • 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 环境。

一、前置基础概念

  1. INCLUDE 环境变量
    编译器 cl.exe 编译阶段,查找 .h/.hpp 头文件的搜索路径。
    代码里 #include <xxx> 会按 INCLUDE 目录顺序依次检索,找不到直接报 fatal error C1004 / C1083: 无法打开包括文件

  2. LIB 环境变量
    链接器 link.exe(cl 内部调用)链接阶段,查找静态库/导入库 .lib 的搜索路径。
    用于解析函数、类、系统 API 的符号引用,找不到库会报 LNK1104 无法打开 xxx.libLNK2019 无法解析的外部符号

  3. 两大组件来源

  • 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 完全依赖这里:

  1. C 标准库头文件stdio.hstring.hstdlib.hstddef.h 等;
  2. C++ 标准库 & STLiostreamvectorrangesconceptsformat<module>(C++20 模块)等全部新标准组件

    你测试 std::views、C++20 特性,必须依赖此目录,缺失直接编译失败。

  3. MSVC 编译器扩展头:vadefs.hcrtdefs.h、编译器内置宏、类型定义;
  4. 异常、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:

  1. 提供跨 Windows 版本兼容的 C 标准运行时声明:文件操作、字符串、格式化、内存管理、时间、数学函数等;
  2. 区分于 MSVC 自带标准库,这是系统层面的 C 运行时接口
  3. 所有控制台程序、读写文件、printf/scanfmalloc/free 底层都依赖此处头文件;
  4. 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 桌面编程核心:

  1. 窗口、消息、控件:windows.hwinuser.hwingdi.h(GDI 图形);
  2. 文件、进程、线程、注册表、服务:winbase.hwinreg.h
  3. 网络、套接字:winsock2.h
  4. 系统权限、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、内核组件、驱动、系统组件共用:

  1. 基础数据类型、结构体、宏、错误码定义:winnt.hntdef.hwinerror.h
  2. 系统通用常量、版本定义、句柄类型;
  3. 很多 um 下的 API 头文件会 #include 这里的文件,属于依赖前置目录

典型报错:缺少此目录 → DWORDHANDLEBOOL 等 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 核心依赖:

  1. C++ 标准库静态/导入库libcpmt.liblibcp.libmsvcprt.lib
    • 负责 std::iostream、容器、算法、C++20 ranges/concepts/format 等所有 STL 实现;
    • 缺失 → 报 LNK1104 无法打开 libcpmt.libLNK2019 无法解析 std::xxx
  2. C 运行时库:libcmt.libmsvcrtd.lib(调试版);
  3. 异常处理、RTTI、动态内存、C++ 类构造析构的底层实现库;
  4. 编译器辅助库、安全检查库(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 运行时)对应的 系统运行时库文件

  1. 对应上面 ucrt 头文件的实现,printffopenstrcpy、数学函数等底层实现;
  2. 负责程序启动、入口函数 main 前置初始化、堆管理、标准流(stdin/stdout/stderr);
  3. 区分 64 位/32 位,这里 x64 专门给 64 位程序使用;
  4. 缺失 → 链接阶段直接报 C 运行时函数未解析。

3. Windows SDK - um\x64

C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\um\x64

用途

Win32 API 对应的 系统导入库,配合 um 头文件使用:

  1. 窗口、图形库:user32.libgdi32.lib
  2. 文件/进程/基础系统库:kernel32.lib几乎所有 Windows 程序都隐式依赖);
  3. 网络、注册表、Shell、多媒体等各类系统 API 库;
  4. 这些是导入库(不是静态库),作用是引导程序运行时加载系统 dll

写普通 C++ 控制台程序,kernel32.lib 是系统默认隐式链接,一般不会报错;
一旦手动调用 Windows API、写窗口程序,缺少此目录会大量报外部符号错误。


四、整体层级与加载顺序(帮你理解整套工具链)

编译阶段(cl.exe → 读 INCLUDE)

  1. 优先找 MSVC include → 解析 C++20 STL、标准头
  2. 再找 UCRT include → 解析 C 运行时函数声明
  3. 再找 shared + um → 解析 Windows 类型、Win32 API

链接阶段(link.exe → 读 LIB)

  1. 优先 MSVC lib\x64 → 链接 C++ STL、标准库实现
  2. UCRT lib\x64 → 链接 C 运行时实现
  3. um lib\x64 → 链接 Windows 系统 API 库

五、场景精简建议(按需取舍)

根据你的使用场景,可以精简目录,不用全加:

  1. 只写纯标准 C/C++ / C++20 控制台(无 Windows API)

    • INCLUDE:保留 MSVC include + ucrt
    • LIB:保留 MSVC lib\x64 + ucrt\x64
      → 去掉 sharedum 也能正常编译运行。
  2. 做 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 库目录
posted @ 2026-06-09 08:54  立体风  阅读(46)  评论(0)    收藏  举报