演练:使用 WSL 2 和 Visual Studio 2022 生成和调试 C++

Visual Studio 2022 引入了一个本机 C++ 工具集来开发适用于 Linux 的 Windows 子系统版本 2 (WSL 2)。 现在可在 Visual Studio 2022 版本 17.0 或更高版本中使用此工具集。

WSL 2 是适用于 Linux 的 Windows 子系统 (WSL) 的新的推荐版本。 它提供更好的 Linux 文件系统性能、GUI 支持和完整的系统调用兼容性。 借助 Visual Studio 的 WSL 2 工具集,无需添加 SSH 连接即可使用 Visual Studio 在 WSL 2 发行版上生成和调试 C++ 代码。 可使用 Visual Studio 2019 版本 16.1 中引入的本机 WSL 1 工具集在 WSL 1 发行版上生成和调试 C++ 代码。

Visual Studio 的 WSL 2 工具集支持基于 CMake 和 MSBuild 的 Linux 项目。 建议在 Visual Studio 中对所有 C++ 跨平台开发使用 CMake。 建议使用 CMake,因为它在 Windows、WSL 和远程系统上生成和调试同一项目。

如需查看关于本主题中的信息的视频演示,请观看视频:使用 WSL 2 发行版和 Visual Studio 2022 调试 C++。

WSL 2 工具集背景信息

Visual Studio 中的 C++ 跨平台支持假定所有源文件都源自 Windows 文件系统。 面向 WSL 2 发行版时,Visual Studio 会执行一个本地 rsync 命令,来将文件从 Windows 文件系统复制到 WSL 文件系统。 本地 rsync 副本不需要任何用户干预。 当 Visual Studio 检测到你正在使用 WSL 2 发行版时,会自动出现此行为。 若要详细了解 WSL 1 与 WSL 2 之间的差异,请参阅比较 WSL 1 和 WSL 2

Visual Studio 中的 CMake 预设集成支持 WSL 2 工具集。 若要了解有关详细信息,请参阅 Visual Studio 和 Visual Studio Code 中的 CMake 预设集成在 Visual Studio 中使用 CMake 预设进行配置和生成。 本文高级 WSL 2 和 CMake 项目注意事项下还有更高级的信息。

安装生成工具

安装在 WSL 2 上进行生成和调试所需的工具。 在稍后的步骤中,你将使用 Visual Studio 的 CMake 二进制部署来安装最新版本的 CMake。

  1. 按照安装 WSL 中的说明来安装 WSL 和 WSL 2 发行版。

  2. 假设你的发行版使用 apt(本演练使用 Ubuntu),此时请使用以下命令在 WSL 2 发行版上安装所需的生成工具:

    sudo apt update
    sudo apt install g++ gdb make ninja-build rsync zip
    

    上述 apt 命令会安装:

    • C++ 编译器
    • gdb
    • CMake
    • rsync
    • zip
    • 基础生成系统生成器

使用 WSL 2 发行版进行跨平台 CMake 开发

本演练使用 Ubuntu 上的 GCC 和 Ninja。 还使用 Visual Studio 2022 版本 17.0 预览版 2 或更高版本。

Visual Studio 将 CMake 项目定义为在项目根目录中有一个 CMakeLists.txt 文件的文件夹。 在此演练中,你将使用 Visual Studio CMake 项目模板创建一个新的 CMake 项目:

  1. 在 Visual Studio 的“开始”屏幕中,选择“创建新项目”

    Visual Studio 2022 入门对话框的屏幕截图。可用选项包括:克隆存储库、打开项目或解决方案、打开本地文件夹、创建新项目或不使用代码继续。

  2. 在“搜索模板”文本框中,键入“cmake”。 选择“CMake 项目”类型,然后选择“下一步”。 提供项目名称和位置,然后选择“创建”

  3. 启用 Visual Studio 的 CMake 预设集成。 选择“工具”>“选项”>“CMake”>“常规”。 选择“首选使用 CMake 预设进行配置、构建和测试”,然后选择“确定”。 相反,你可能已在项目的根目录下添加了一个 CMakePresets.json 文件。 有关详细信息,请参阅启用 CMake 预设集成

    Visual Studio 项目选项的屏幕截图。已选择“Cmake”>“常规”。

    在 CMake 配置文件组中,已调出并选中“使用 CMake 预设(如果可用),否则使用 CMakeSettings.json”。

  4. 若要激活集成:在主菜单中,选择“文件”>“关闭文件夹”。 这会显示“开始”页面。 在“打开最近使用的文件”下,选择刚关闭的文件夹来重新打开它

  5. Visual Studio 主菜单栏上有 3 个下拉列表。 使用左侧的下拉列表可选择活动目标系统。 将在此系统上调用 CMake 来配置和生成项目。 Visual Studio 使用 wsl -l -v 查询 WSL 安装项。 在下图中,显示了 WSL2: Ubuntu-20.04,且已选中它作为目标系统

    Visual Studio 目标系统下拉列表的屏幕截图。已选择 WSL2: Ubuntu-20.04。

    注意

    如果 Visual Studio 开始自动配置项目,请阅读步骤 11 来管理 CMake 二进制部署,然后继续执行以下步骤。 若要自定义此行为,请参阅修改自动配置和缓存通知

  6. 使用中间的下拉列表可选择活动配置预设。 配置预设会指示 Visual Studio 如何调用 CMake 和生成基础生成系统。 在步骤 7 中,活动配置预设是 Visual Studio 创建的 linux-default 预设。 若要创建自定义配置预设,请选择“管理配置...”;有关配置预设的详细信息,请参阅选择配置预设编辑预设

    Visual Studio 活动配置预设下拉列表的屏幕截图。已选中“管理配置…”。

  7. 使用右侧下拉列表可选择活动生成预设。 生成预设会指示 Visual Studio 如何调用生成。 在步骤 7 的插图中,活动生成预设是 Visual Studio 创建的默认生成预设。 若要详细了解生成预设,请参阅选择生成预设

  8. 在 WSL 2 上配置项目。 如果项目生成没有自动启动,请使用“项目”>“配置 <项目名称>”手动调用配置

    Visual Studio 项目配置下拉列表的屏幕截图。已选择“配置 CMakeProject”。

  9. 如果未在 WSL 2 发行版上安装受支持的 CMake 版本,Visual Studio 将在主菜单功能区下提示部署最新版本的 CMake。 选择“是”,将 CMake 二进制文件部署到 WSL 2 发行版

    Visual Studio 工具栏下方提示的屏幕截图

    系统会提示用户是否从 C make 安装最新的 C Make 二进制文件。 org,因为未安装受支持的 C Make 版本。”

  10. 确认已完成配置步骤,并且你在“CMake”窗格下的“输出”窗口中看到“CMake 生成已完成”消息。 生成文件会写入 WSL 2 发行版的文件系统中的某个目录。

    Visual Studio 输出窗口的屏幕截图。其中包含在配置步骤期间生成的消息,包括“C Make 生成已完成”。

  11. 选择活动调试目标。 调试下拉菜单列出了项目可使用的所有 CMake 目标。

    Visual Studio 调试下拉菜单的屏幕截图。已选择 CMakeProject。

  12. 在解决方案资源管理器中展开项目子文件夹。 在 CMakeProject.cpp 文件中,在 main() 中设置断点。 还可在解决方案资源管理器中选择“视图选取器”按钮,导航到 CMake 目标视图,如以下屏幕截图中高亮所示

    Visual Studio 解决方案资源管理器的屏幕截图,其中显示了用于切换视图的按钮。该按钮位于主页按钮的右侧。

  13. 选择“调试”>“开始”,或者按 F5。 项目会执行生成操作,可执行文件将在 WSL 2 发行版上启动,而 Visual Studio 将在断点处停止执行。 Linux 控制台窗口会显示程序的输出(在本例中为 "Hello CMake."):

    正在运行的 hello world 程序的屏幕截图。

    Visual Studio Linux 控制台窗口显示程序的输出:“Hello C Make.” 编辑器窗口显示 hello world 程序。 执行在 return 0; 行的断点处停止。”

现在,你已使用 WSL 2 和 Visual Studio 2022 生成和调试了 C++ 应用。

高级 WSL 2 和 CMake 项目注意事项

Visual Studio 仅对将 CMakePresets.json 用作活动配置文件的 WSL 2 for CMake 项目提供本机支持。 若要从 CMakeSettings.json 迁移到 CMakePresets.json,请参阅启用 Visual Studio 中的 CMake 预设集成

如果面向 WSL 2 发行版,但你不想使用 WSL 2 工具集,请在 CMakePresets.json 中的 Visual Studio 远程设置供应商映射中,将 forceWSL1Toolset 设置为 true。 有关详细信息,请参阅 Visual Studio 远程设置供应商映射

如果 forceWSL1Tooslet 设置为 true,Visual Studio 不会在 WSL 文件系统中维护源文件的副本。 相反,它会访问已安装的 Windows 驱动器 (/mnt/…) 中的源文件。

在大多数情况下,最好将 WSL 2 工具集与 WSL 2 发行版一起使用,因为当项目文件改为存储在 Windows 文件系统中时,WSL 2 速度会变慢。 若要详细了解 WSL 2 中的文件系统性能,请参阅比较 WSL 1 和 WSL 2

CMakePresets.json 中的 Visual Studio 远程设置供应商映射中,指定高级设置,例如 WSL 2 上项目要复制到的目录的路径、复制源选项和 rsync 命令参数。 有关详细信息,请参阅 Visual Studio 远程设置供应商映射

系统标头仍会自动复制到 Windows 文件系统,以提供本机 IntelliSense 体验。 可在 CMakePresets.json 中的 Visual Studio 远程设置供应商映射中,自定义要包含或不包含在此副本中的标头。

可在 CMakePresets.json 中的 Visual Studio 设置供应商映射中,更改 IntelliSense 模式或指定其他 IntelliSense 选项。 若要详细了解供应商映射,请参阅 Visual Studio 远程设置供应商映射

基于 WSL 2 和 MSBuild 的 Linux 项目

建议在 Visual Studio 中对所有 C++ 跨平台开发使用 CMake,因为你可用它在 Windows、WSL 和远程系统上生成和调试同一项目。

但是,你可能有一个基于 MSBuild 的 Linux 项目。

如果你有基于 MSBuild 的 Linux 项目,你可升级到 Visual Studio 中的 WSL 2 工具集。 请在解决方案资源管理器中右键单击项目,然后选择“属性”>“常规”>“平台工具集”:

Visual Studio 下拉列表的屏幕截图,其中已选中“平台工具集”,右侧是另一个下拉列表,其中已选中“WSL2 工具集”。

如果正在面向 WSL 2 发行版,但你不想使用 WSL 2 工具集,请在“平台工具集”下拉列表中,选择“适用于 Linux 的 Windows 子系统的 GCC”或“适用于 Linux 的 Windows 子系统的 Clang”工具集。 如果选择了上述任一工具集,则 Visual Studio 不会在 WSL 文件系统中维护源文件的副本,而是通过装载的 Windows 驱动器 (/mnt/…) 访问源文件。 系统标头仍会自动复制到 Windows 文件系统,来提供本机 IntelliSense 体验。 在“属性页”>“常规”中,自定义要包含或不包含在此副本中的标头

在大多数情况下,最好将 WSL 2 工具集与 WSL 2 发行版一起使用,因为当项目文件存储在 Windows 文件系统中时,WSL 2 速度会变慢。 要了解详细信息,请参阅比较 WSL 1 和 WSL 2

另请参阅

视频:使用 WSL 2 发行版和 Visual Studio 2022 调试 C++
下载 Visual Studio 2022
在 Visual Studio 中创建 CMake Linux 项目
教程:在远程 Windows 计算机上调试 CMake 项目