开发linux项目-在 Windows 上 基于“适用于 Linux 的 Windows 子系统(WSL)”

在 Windows 上 基于"适用于 Linux 的 Windows 子系统(WSL)"开发linux项目

建议为跨平台或将设为开源的项目使用 CMake。 可以使用 CMake 项目在 Windows、适用于 Linux 的 Windows 子系统 (WSL) 和远程系统上生成和调试相同源代码。

1、必须确保 Windows上 的Visual Studio 支持C++ 的 Linux 开发

首先,请确保已安装 Visual Studio Linux 工作负载,包括 CMake 组件。 它属于 Visual Studio 安装程序中的"使用 C++ 的 Linux 开发"工作负载。可参阅:下载、安装和设置 Linux 工作负载-CSDN博客

CMake 是一种跨平台开源工具,用于定义在多个平台上运行的生成过程。 本文假定你熟悉 CMake。 有关 CMake 的详细信息,请参阅 CMake 文档https://cmake.org/cmake/help/latest/index.html#。 建议从 CMake 教程 https://cmake.org/cmake/help/latest/guide/tutorial/index.html#guide:CMake%20Tutorial开始了解详细信息。

Visual Studio 对 CMake 的本机支持允许你从 Visual Studio 的同一实例编辑、生成和调试 Windows 上的 CMake 项目、适用于 Linux 的 Windows 子系统(WSL)和远程系统。 CMake 项目文件(例如CMakeLists.txt)直接由 Visual Studio 使用,以实现 IntelliSense 和浏览功能。 Visual Studio 直接调用 cmake.exe 进行 CMake 配置和生成。

"用于 Windows 的 C++ CMake 工具"作为"使用 C++ 的桌面开发"和"使用 C++ 的 Linux 开发"工作负载的一部分进行安装。 跨平台 CMake 开发需要适用于 Windows 的 C++ CMake 工具和"使用 C++ 的 Linux 开发"。

2、使用 Visual Studio 连接到 WSL的 Linux 系统

可以将 Linux 项目配置为以远程计算机或适用于 Linux 的 Windows 子系统 (WSL) 为目标。 对于远程计算机,需要在 Visual Studio 中设置远程连接,可参考使用 Visual Studio 连接到目标 Linux 系统 | Microsoft Learn。 对于 WSL,只需要连接到 WSL。

连接到 WSL:WSL 上的 Ubuntu

从 Visual Studio 2019 版本 16.1 开始,Visual Studio 本机支持将 C++ 与适用于 Linux 的 Windows 子系统 (WSL) 结合使用。 这意味着可以直接在本地 WSL 安装上生成和调试。 不再需要添加远程连接或配置 SSH。 可在此处找到有关如何安装 WSL的详细信息。

若要配置 WSL 安装,使其可与 Visual Studio 结合使用,则需安装以下工具:gccclanggdbmakeninja-build (仅适用于使用 Visual Studio 2019 版本 16.6 或更高版本的 CMake 项目)rsynczip 。 你可以使用此命令将它们安装在使用 apt 的发行版上,这还将安装 g++ 编译器。

以 WSL 为目标时,无需添加远程连接或配置 SSH 即可进行生成和调试。 使用 Visual Studio for Intellisense 支持自动同步 Linux 标头需要 zip 和 rsync 。 仅 CMake 项目需要 ninja-build 。 如果所需应用程序尚不存在,则可以使用以下命令进行安装:

Bash

bash 复制代码
sudo apt-get install g++ gdb make ninja-build rsync zip

上述 apt 命令会安装:

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

此时,就连接到 WSL 上的Ubuntu 系统了。

3、创建 Linux CMake 项目

(1)新建 Linux 项目

若要在 Visual Studio 2019 中创建新的 Linux CMake 项目,请执行以下操作:

  • 《1》在 Visual Studio 中选择"文件">"新建项目",或按 Ctrl + Shift + N。
  • 《2》将"语言"设置为"C++",然后搜索"CMake"。 然后选择"下一步"。 输入"名称"和"位置",然后选择"创建"。

或者,可以在 Visual Studio 2019 中打开自己的 CMake 项目。 下面的部分说明如何执行此操作。

Visual Studio 创建一个最小的 CMakeLists.txt 文件,其中只包含可执行文件的名称和所需的最小 CMake 版本。 可以按自己喜欢的方式手动编辑此文件;Visual Studio 永远不会覆盖所做的更改。

  • 《3》启用 Visual Studio 的 CMake 预设集成。

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

  • 《4》若要激活集成:在主菜单中,选择"文件""关闭文件夹">。 这会显示"开始"页面。 在"打开最近使用的文件"下,选择刚关闭的文件夹来重新打开它。
  • 《5》Visual Studio 主菜单栏上有 3 个下拉列表。 使用左侧的下拉列表可选择活动目标系统。 将在此系统上调用 CMake 来配置和生成项目。 Visual Studio 使用 wsl -l -v 查询 WSL 安装项。 在下图中,显示了 WSL2: Ubuntu-20.04,且已选中它作为目标系统。
  • 《6》使用中间的下拉列表可选择活动配置预设。 配置预设会指示 Visual Studio 如何调用 CMake 和生成基础生成系统。 在步骤 7 中,活动配置预设是 Visual Studio 创建的 linux-default 预设。 若要创建自定义配置预设,请选择"管理配置...";有关配置预设的详细信息,请参阅选择配置预设编辑预设
  • 《7》使用右侧下拉列表可选择活动生成预设。 生成预设会指示 Visual Studio 如何调用生成。 在步骤 5 的插图中,活动生成预设是 Visual Studio 创建的默认生成预设。 若要详细了解生成预设,请参阅选择生成预设

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

  • 《9》如果未在 WSL 2 发行版上安装受支持的 CMake 版本,Visual Studio 将在主菜单功能区下提示部署最新版本的 CMake。 选择"是",将 CMake 二进制文件部署到 WSL 2 发行版。(会在后面特意说明)
  • 《10》确认已完成配置步骤,并且你在"CMake "窗格下的"输出 "窗口中看到"CMake 生成已完成"消息。 生成文件会写入 WSL 2 发行版的文件系统中的某个目录。
  • 《11》选择活动调试目标。 调试下拉菜单列出了项目可使用的所有 CMake 目标。
  • 《12》在解决方案资源管理器中展开项目子文件夹。 在 CMakeProject.cpp 文件中,在 main() 中设置断点。 还可在解决方案资源管理器中选择"视图选取器"按钮,导航到 CMake 目标视图,如以下屏幕截图中高亮所示:
  • 《13》选择"调试""开始",或者按 F5>。 项目会执行生成操作,可执行文件将在 WSL 2 发行版上启动,而 Visual Studio 将在断点处停止执行。 Linux 控制台窗口会显示程序的输出(在本例中为 "Hello CMake."):

以下示例显示了一个简单的 CMakeLists.txt 文件和 .cpp 文件、.h 文件:

cpp 复制代码
# CMakeList.txt: CMakeUnix1 的 CMake 项目,在此处包括源代码并定义
# 项目特定的逻辑。
#
cmake_minimum_required (VERSION 3.8)

#project (hello-cmake)

# 将源代码添加到此项目的可执行文件。
add_executable (CMakeUnix1 "CMakeUnix1.cpp" "CMakeUnix1.h")

# TODO: 如有需要,请添加测试并安装目标。
cpp 复制代码
// CMakeUnix1.cpp: 定义应用程序的入口点。
//

#include "CMakeUnix1.h"

using namespace std;

int main()
{
	cout << "Hello CMake." << endl;
	return 0;
}
cpp 复制代码
// CMakeUnix1.h: 标准系统包含文件的包含文件
// 或项目特定的包含文件。

#pragma once

#include <iostream>

// TODO: 在此处引用程序需要的其他标头。

CMakePresets_schema.json

cpp 复制代码
{
  "version": 2,
  "configurePresets": [
    {
      "name": "linux-default",
      "displayName": "Linux Debug",
      "description": "面向适用于 Linux 的 Windows 子系统(WSL)或远程 Linux 系统。",
      "generator": "Ninja",
      "binaryDir": "${sourceDir}/out/build/${presetName}",
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Debug",
        "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}"
      },
      "vendor": {
        "microsoft.com/VisualStudioSettings/CMake/1.0": { "hostOS": [ "Linux" ] },
        "microsoft.com/VisualStudioRemoteSettings/CMake/1.0": { "sourceDir": "$env{HOME}/.vs/$ms{projectDirName}" }
      }
    },
    {
      "name": "windows-default",
      "displayName": "Windows x64 Debug",
      "description": "面向具有 Visual Studio 开发环境的 Windows。",
      "generator": "Ninja",
      "binaryDir": "${sourceDir}/out/build/${presetName}",
      "architecture": {
        "value": "x64",
        "strategy": "external"
      },
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Debug",
        "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}"
      },
      "vendor": { "microsoft.com/VisualStudioSettings/CMake/1.0": { "hostOS": [ "Windows" ] } }
    }
  ]
}
cpp 复制代码
# CMakeList.txt: 顶层 CMake 项目文件,在此处执行全局配置
# 并包含子项目。
#
cmake_minimum_required (VERSION 3.8)

project ("CMakeUnix1")

# 包含子项目。
add_subdirectory ("CMakeUnix1")

(2)或 打开 CMake 项目文件夹

打开包含现有 CMake 项目的文件夹时,Visual Studio 会使用 CMake 缓存中的变量来自动配置 IntelliSense 和生成。 本地配置和调试设置将存储在 JSON 文件中。 可以选择与使用 Visual Studio 的其他人共享这些文件。

Visual Studio 不会修改 CMakeLists.txt 文件。 这使得处理同一项目的其他人员可以继续使用其现有工具。 在保存对 CMakeLists.txt 的编辑或在某些情况下保存对 CMakeSettings.json 的编辑时,Visual Studio 会重新生成缓存。 如果使用的是"现有缓存"配置,则 Visual Studio 不会修改缓存。

有关 Visual Studio 中的 CMake 支持的常规信息,请参阅 Visual Studio 中的 CMake 项目。 在继续之前,请先阅读相关内容。

首先,在主菜单中选择文件 >打开 >文件夹 ,或在开发人员命令提示窗口中键入 devenv.exe <foldername>。 打开的文件夹中应该有一个 CMakeLists.txt 文件,以及你的源代码。

4、在 Visual Studio 中,将 Microsoft 的 CMake 包部署到适用于 Linux 的 Windows 子系统 (WSL)

在 Visual Studio 中,将 Microsoft 的 CMake 包部署到适用于 Linux 的 Windows 子系统 (WSL) 是一个自动化的过程,通常由 Visual Studio 在检测到需要时自动处理。以下是详细步骤和相关信息。

(1)部署过程概述

当您在 Visual Studio 中配置一个 CMake 项目并以 WSL 为目标系统时,如果 WSL 发行版上未安装支持的 CMake 版本,Visual Studio 会自动提示您部署最新版本的 CMake 二进制文件。这个过程包括将 CMake 安装到 WSL 环境中,以便后续的生成和调试操作能够顺利进行。‌

(2)具体步骤

  1. 打开 CMake 项目 ‌:在 Visual Studio 中,选择"文件">"打开">"文件夹",然后导航到包含 CMakeLists.txt 文件的项目根目录。‌
  2. 选择 WSL 作为目标系统‌:在 Visual Studio 主工具栏的"目标系统"下拉列表中,选择您的 WSL 发行版(例如 Ubuntu)。Visual Studio 会自动检测已安装的 WSL 系统。‌
  3. 自动部署提示 ‌:如果 WSL 上未安装支持的 CMake 版本,Visual Studio 会在"输出"窗口中显示提示消息,例如:"检测到 CMake 缓存过期。正在自动配置项目..." 或直接提示部署 CMake。‌
  4. 确认部署 ‌:在提示出现时,选择"是"或"部署"选项, Visual Studio 会自动将最新版本的 CMake 二进制文件部署到 WSL 发行版。部署完成后,您会在"输出"窗口中看到"CMake 生成完成"的消息。‌
  5. 验证安装 ‌:部署成功后,您可以打开 WSL 终端,运行 **cmake --version**来验证 CMake 是否已正确安装。

(3)注意事项

  • ‌WSL 版本‌:确保使用 WSL 2,因为 WSL 1 可能不支持某些功能。您可以通过 wsl -l -v 命令检查 WSL 安装。‌
  • ‌手动安装备用‌:如果自动部署失败,您可以手动在 WSL 发行版中安装 CMake。例如,在基于 Debian/Ubuntu 的系统上,使用以下命令: Bash

    bash 复制代码
    sudo apt update
    sudo apt install cmake
  • ‌Visual Studio 配置‌:为了启用 CMake 预设集成,建议在"工具">"选项">"CMake">"常规"中选中"使用 CMake 预设进行配置、构建和测试"。然后关闭并重新打开项目文件夹以激活集成。‌

通过以上步骤,Visual Studio 会无缝处理 CMake 的部署,使您能够专注于开发。如果遇到问题,请检查 WSL 连接和 Visual Studio 的更新状态。

请参阅 :

1、下载、安装和设置 Linux 工作负载-CSDN博客

2、在 Windows 上安装 Linux-CSDN博客

3、使用 Visual Studio 连接到目标 Linux 系统 | Microsoft Learn

4、Visual Studio 中的 CMake 项目 | Microsoft Learn

5、演练:使用适用于 Linux 的 Microsoft Windows 子系统 2 (WSL 2) 和 Visual Studio 2022 生成和调试 C++ | Microsoft Learn

CMakeSettings.json 模板目录:

C:\Users\mt\Documents\VisualStudio\CMakeSettingsTemplates

【有点碎片化,还没整理完......】

相关推荐
提伯斯6461 分钟前
解决 PX4 + ROS px4ctrl 「No odom!」自动起飞失败问题
linux·ros·px4·fastlio·mid360·egoplanner
Once_day12 分钟前
CC++八股文之内存
c语言·c++
牛奶咖啡1324 分钟前
shell脚本编程(八)
linux·shell脚本编程·while循环语句·计数器控制的while循环·标志控制的while循环·until循环·select循环菜单
量子炒饭大师24 分钟前
【C++入门】Cyber骇客的同名异梦——【C++重载函数】(与C的函数差异)
c语言·开发语言·c++·函数重载
Q168496451527 分钟前
知识点-创建、查看和编辑文本文件
linux·运维
charlie11451419128 分钟前
现代嵌入式C++教程:if constexpr——把编译期分支写得像写注释 —— 工程味实战指南
开发语言·c++·笔记·学习·嵌入式·现代c++
LIZhang201630 分钟前
c++ 转化句柄,解决多线程安全释放问题
开发语言·c++
小宇的天下36 分钟前
Calibre 3Dstack --每日一个命令days11【dangling_ports】(3-11)
linux·运维·服务器
youqingyike40 分钟前
Qt 中 QWidget 调用setLayout 后不显示
开发语言·c++·qt
HIT_Weston1 小时前
97、【Ubuntu】【Hugo】搭建私人博客:搜索功能(二)
linux·运维·ubuntu