在VS Code中使用C ++和WSL

在VS Code中使用C ++和WSL

 

 

在本教程中,您将配置Visual Studio Code以在Linux的Windows子系统(WSL)的Ubuntu上使用GCC C ++编译器(g ++)和GDB调试器。GCC代表GNU编译器集合;GDB是GNU调试器。WSL是Windows中的Linux环境,可以直接在计算机硬件上运行,而不是在虚拟机中运行。

注意:本教程的大部分内容都适用于直接在Linux机器上使用C ++和VS Code。

Visual Studio Code支持使用Remote-WSL扩展名直接在WSL中工作。我们建议采用这种WSL开发模式,在该模式下,所有源代码文件(除编译器外)都托管在Linux发行版上。有关更多背景信息,请参见VS代码远程开发

完成本教程后,您将准备创建和配置自己的C ++项目,并浏览VS Code文档以获取有关其许多功能的更多信息。本教程不会教您有关GCC或Linux或C ++语言的信息。对于这些主题,Web上有许多不错的资源。

如果您有任何问题,请随时在VS Code文档库中提交本教程的问题。

先决条件

要成功完成本教程,您必须执行以下步骤:

  1. 安装Visual Studio代码

  2. 安装Remote-WSL扩展

  3. 安装适用于Linux的Windows子系统,然后使用同一页面上的链接安装您选择的Linux发行版。本教程使用Ubuntu。在安装过程中,请记住您的Linux用户密码,因为安装其他软件将需要它。

设置您的Linux环境

  1. 打开WSL的Bash shell。如果安装了Ubuntu发行版,请在Windows搜索框中键入“ Ubuntu”,然后在结果列表中单击它。对于Debian,键入“ Debian”,依此类推。

    开始菜单中的Ubuntu

    该外壳将显示一个命令提示符,默认情况下该命令提示符由您的用户名和计算机名组成,并将您置于主目录中。对于Ubuntu,它看起来像这样:

    重击壳

  2. 创建一个目录projects,然后在该目录下创建一个子目录helloworld

    <span style="color:#333333"><code><span style="color:#000000">mkdir projects</span>
    <span style="color:#795e26">cd</span><span style="color:#000000"> projects</span>
    <span style="color:#000000">mkdir helloworld</span></code></span>
  3. 尽管将使用VS Code编辑源代码,但是您将使用g ++编译器在Linux上编译源代码。您还将使用GDB在Linux上进行调试。这些工具默认未在Ubuntu上安装,因此您必须安装它们。幸运的是,该任务非常简单!

  4. 在WSL命令提示符下,首先运行apt-get update以更新Ubuntu软件包列表。过时的发行版有时会干扰尝试安装新软件包。

    <span style="color:#333333"><code><span style="color:#000000">sudo apt-get update</span></code></span>

    如果愿意,还可以运行sudo apt-get update && sudo apt-get dist-upgrade以下载系统软件包的最新版本,但这可能会花费更长的时间,具体取决于您的连接速度。

  5. 在命令提示符下,键入以下命令来安装GNU编译器工具和GDB调试器:

    <span style="color:#333333"><code><span style="color:#000000">sudo apt-get install build-essential gdb</span></code></span>
  6. 通过找到g ++和gdb来验证安装是否成功。如果没有从whereis命令返回文件名,请尝试再次运行update命令。

    <span style="color:#333333"><code><span style="color:#000000">whereis g++</span>
    <span style="color:#000000">whereis gdb</span></code></span>

注意:如果直接在Linux机器而不是WSL上工作,则适用于安装g ++编译器和GDB调试器的设置步骤。在helloworld项目中运行VS Code,以及编辑,构建和调试步骤是相同的​​。

 

在WSL中运行VS代码

导航到helloworld项目文件夹,然后从WSL终端启动VS Code code .

<span style="color:#333333"><code><span style="color:#795e26">cd</span> <span style="color:#001080">$HOME</span><span style="color:#000000">/projects/helloworld</span>
<span style="color:#000000">code </span><span style="color:#795e26">.</span></code></span>

您将看到有关“安装VS Code服务器”的消息。VS Code正在Linux端下载并安装小型服务器,然后桌面VS Code将与之对话。然后,VS Code将启动并打开helloWorld文件夹。文件资源管理器显示VS Code现在在带有标题栏[WSL:Ubuntu]的WSL上下文中运行。

WSL中的文件资源管理器

您还可以从状态栏中告诉远程上下文。

状态栏中的远程上下文

如果单击“远程状态”栏项目,将看到适合该会话的“远程”命令的下拉列表。例如,如果要结束在WSL中运行的会话,则可以从下拉列表中选择“ 关闭远程连接”命令。运行code .从WSL命令提示符将重新启动VS代码在运行WSL。

代码。命令在当前工作文件夹中打开了VS Code,这将成为您的“工作区”。在学习本教程的过程中,您将看到.vscode在工作区的文件夹中创建的三个文件:

  • c_cpp_properties.json (编译器路径和IntelliSense设置)
  • tasks.json (制作说明)
  • launch.json (调试器设置)

添加源代码文件

在文件资源管理器标题栏中,选择“ 新建文件”按钮并命名该文件helloworld.cpp

新文件标题栏按钮

安装C / C ++扩展

创建文件并且VS Code检测到它是C ++语言文件后,如果尚未安装Microsoft C / C ++扩展名,则可能会提示您安装它。

C ++扩展通知

在“扩展”视图中显示按钮时,选择“ 安装”,然后选择“ 需要重新加载”以完成C / C ++扩展的安装。

如果您已经在VS Code中本地安装了C / C ++语言扩展,则需要转到“扩展”视图(Ctrl + Shift + X)并将这些扩展安装到WSL中。通过选择“ 在WSL中安装”按钮,然后选择“ 需要重新加载”,可以将本地安装的扩展安装到WSL中。

在WSL中安装按钮

添加Hello World源代码

现在粘贴此源代码:

<span style="color:#333333"><code><span style="color:#0000ff">#include </span><span style="color:#a31515"><iostream></span>
<span style="color:#0000ff">#include </span><span style="color:#a31515"><vector></span>
<span style="color:#0000ff">#include </span><span style="color:#a31515"><string></span>

<span style="color:#0000ff">using</span> <span style="color:#0000ff">namespace</span> <span style="color:#267f99">std</span><span style="color:#000000">;</span>

<span style="color:#0000ff">int</span> <span style="color:#795e26">main</span><span style="color:#000000">()</span>
<span style="color:#000000">{</span>
<span style="color:#000000">   vector<string> msg {</span><span style="color:#a31515">"Hello"</span><span style="color:#000000">, </span><span style="color:#a31515">"C++"</span><span style="color:#000000">, </span><span style="color:#a31515">"World"</span><span style="color:#000000">, </span><span style="color:#a31515">"from"</span><span style="color:#000000">, </span><span style="color:#a31515">"VS Code"</span><span style="color:#000000">, </span><span style="color:#a31515">"and the C++ extension!"</span><span style="color:#000000">};</span>

   <span style="color:#0000ff">for</span><span style="color:#000000"> (</span><span style="color:#0000ff">const</span><span style="color:#000000"> string& word : msg)</span>
<span style="color:#000000">   {</span>
<span style="color:#000000">      cout << word << </span><span style="color:#a31515">" "</span><span style="color:#000000">;</span>
<span style="color:#000000">   }</span>
<span style="color:#000000">   cout << endl;</span>
<span style="color:#000000">}</span></code></span>

现在按Ctrl + S保存文件。请注意,刚添加的文件如何显示在VS Code侧栏中的文件资源管理器视图(Ctrl + Shift + E)中:

文件管理器

您还可以通过选中“ 文件 ”主菜单中的“ 自动保存”,启用“ 自动保存”以自动保存文件更改。

最左侧的活动栏使您可以打开不同的视图,例如“ 搜索”,“ 源代码管理 ”和“运行”。您将在本教程后面的“运行”视图中查看。您可以在VS Code 用户界面文档中找到有关其他视图的更多信息。

 

探索智能感知

在新helloworld.cpp文件中,将鼠标悬停在vector或上string以查看类型信息。声明msg变量后,msg.像在调用成员函数时一样开始键入。您应该立即看到一个显示所有成员函数的完成列表,以及一个显示该msg对象的类型信息的窗口:

语句完成IntelliSense

您可以按Tab键插入选定的成员。然后,当您添加左括号时,您将看到有关该函数所需的任何参数的信息。

编译helloworld.cpp

接下来,您将创建一个tasks.json文件来告诉VS Code如何构建(编译)程序。该任务将在WSL上调用g ++编译器,以基于源代码创建可执行文件。

在主菜单中,选择Terminal > Configure Default Build Task。在下拉列表中,将显示任务下拉列表,其中列出了C ++编译器的各种预定义构建任务。选择g ++ build active file,它将构建当前在编辑器中显示(活动)的文件。

任务C ++构建下拉列表

这将tasks.json.vscode文件夹中创建一个文件,然后在编辑器中将其打开。

您的新tasks.json文件应类似于以下JSON:

<span style="color:#333333"><code><span style="color:#000000">{</span>
  <span style="color:#0451a5">"version"</span><span style="color:#000000">: </span><span style="color:#a31515">"2.0.0"</span><span style="color:#000000">,</span>
  <span style="color:#0451a5">"tasks"</span><span style="color:#000000">: [</span>
<span style="color:#000000">    {</span>
      <span style="color:#0451a5">"type"</span><span style="color:#000000">: </span><span style="color:#a31515">"shell"</span><span style="color:#000000">,</span>
      <span style="color:#0451a5">"label"</span><span style="color:#000000">: </span><span style="color:#a31515">"g++ build active file"</span><span style="color:#000000">,</span>
      <span style="color:#0451a5">"command"</span><span style="color:#000000">: </span><span style="color:#a31515">"/usr/bin/g++"</span><span style="color:#000000">,</span>
      <span style="color:#0451a5">"args"</span><span style="color:#000000">: [</span><span style="color:#a31515">"-g"</span><span style="color:#000000">, </span><span style="color:#a31515">"${file}"</span><span style="color:#000000">, </span><span style="color:#a31515">"-o"</span><span style="color:#000000">, </span><span style="color:#a31515">"${fileDirname}/${fileBasenameNoExtension}"</span><span style="color:#000000">],</span>
      <span style="color:#0451a5">"options"</span><span style="color:#000000">: {</span>
        <span style="color:#0451a5">"cwd"</span><span style="color:#000000">: </span><span style="color:#a31515">"/usr/bin"</span>
<span style="color:#000000">      },</span>
      <span style="color:#0451a5">"problemMatcher"</span><span style="color:#000000">: [</span><span style="color:#a31515">"$gcc"</span><span style="color:#000000">],</span>
      <span style="color:#0451a5">"group"</span><span style="color:#000000">: {</span>
        <span style="color:#0451a5">"kind"</span><span style="color:#000000">: </span><span style="color:#a31515">"build"</span><span style="color:#000000">,</span>
        <span style="color:#0451a5">"isDefault"</span><span style="color:#000000">: </span><span style="color:#0000ff">true</span>
<span style="color:#000000">      }</span>
<span style="color:#000000">    }</span>
<span style="color:#000000">  ]</span>
<span style="color:#000000">}</span></code></span>

command设置指定要运行的程序;在这种情况下是g ++。该args数组指定将传递给g ++的命令行参数。必须按照编译器期望的顺序指定这些参数。此任务告诉g ++获取活动文件(${file}),对其进行编译,然后在当前目录(${fileDirname})中创建一个与活动文件同名但没有扩展名(${fileBasenameNoExtension})的可执行文件,helloworld以我们的示例为例。

注意:您可以task.json变量参考中了解有关变量的更多信息。

label值就是您将在任务列表中看到的值;您可以随意命名。

对象中的"isDefault": truegroup指定当您按Ctrl + Shift + B时将运行此任务。此属性仅出于方便起见;如果将其设置为false,您仍然可以从“终端”菜单中使用“ 任务:运行构建任务”来运行它。

运行构建

  1. 回到helloworld.cpp。您的任务将生成活动文件,并且您要生成helloworld.cpp

  2. 要运行中定义的构建任务tasks.json,请按Ctrl + Shift + B或从“ 终端”主菜单中选择“ 任务:运行构建任务”

  3. 任务启动时,您应该看到“集成终端”面板出现在源代码编辑器下方。任务完成后,终端将显示编译器的输出,指示构建成功还是失败。对于成功的g ++构建,输出看起来像这样:

    G ++在终端中构建输出

  4. 使用+按钮创建一个新终端,您将在WSL上下文中运行一个bash终端,并将helloworld文件夹作为工作目录。运行ls,您现在应该看到可执行文件helloworld(没有文件扩展名)。

    WSL bash终端

  5. 您可以helloworld在终端中输入来运行./helloworld

修改task.json

您可以tasks.json使用"${workspaceFolder}/*.cpp"代替的参数来修改以构建多个C ++文件${file}。您也可以通过替换"${fileDirname}/${fileBasenameNoExtension}"为硬编码的文件名(例如“ helloworld.out”)来修改输出文件名。

调试helloworld.cpp

接下来,您将创建一个launch.json文件,以配置VS Code以在按F5调试程序时启动GDB调试器。从主菜单中,选择“运行” >“ 添加配置...”,然后选择“ C ++(GDB / LLDB)”

然后,您将看到各种预定义调试配置的下拉列表。选择g ++构建并调试活动文件

C ++调试配置下拉列表

VS Code创建一个launch.json文件,在编辑器中将其打开,然后生成并运行“ helloworld”。

<span style="color:#333333"><code><span style="color:#000000">{</span>
  <span style="color:#0451a5">"version"</span><span style="color:#000000">: </span><span style="color:#a31515">"0.2.0"</span><span style="color:#000000">,</span>
  <span style="color:#0451a5">"configurations"</span><span style="color:#000000">: [</span>
<span style="color:#000000">    {</span>
      <span style="color:#0451a5">"name"</span><span style="color:#000000">: </span><span style="color:#a31515">"g++ build and debug active file"</span><span style="color:#000000">,</span>
      <span style="color:#0451a5">"type"</span><span style="color:#000000">: </span><span style="color:#a31515">"cppdbg"</span><span style="color:#000000">,</span>
      <span style="color:#0451a5">"request"</span><span style="color:#000000">: </span><span style="color:#a31515">"launch"</span><span style="color:#000000">,</span>
      <span style="color:#0451a5">"program"</span><span style="color:#000000">: </span><span style="color:#a31515">"${fileDirname}/${fileBasenameNoExtension}"</span><span style="color:#000000">,</span>
      <span style="color:#0451a5">"args"</span><span style="color:#000000">: [],</span>
      <span style="color:#0451a5">"stopAtEntry"</span><span style="color:#000000">: </span><span style="color:#0000ff">false</span><span style="color:#000000">,</span>
      <span style="color:#0451a5">"cwd"</span><span style="color:#000000">: </span><span style="color:#a31515">"${workspaceFolder}"</span><span style="color:#000000">,</span>
      <span style="color:#0451a5">"environment"</span><span style="color:#000000">: [],</span>
      <span style="color:#0451a5">"externalConsole"</span><span style="color:#000000">: </span><span style="color:#0000ff">false</span><span style="color:#000000">,</span>
      <span style="color:#0451a5">"MIMode"</span><span style="color:#000000">: </span><span style="color:#a31515">"gdb"</span><span style="color:#000000">,</span>
      <span style="color:#0451a5">"setupCommands"</span><span style="color:#000000">: [</span>
<span style="color:#000000">        {</span>
          <span style="color:#0451a5">"description"</span><span style="color:#000000">: </span><span style="color:#a31515">"Enable pretty-printing for gdb"</span><span style="color:#000000">,</span>
          <span style="color:#0451a5">"text"</span><span style="color:#000000">: </span><span style="color:#a31515">"-enable-pretty-printing"</span><span style="color:#000000">,</span>
          <span style="color:#0451a5">"ignoreFailures"</span><span style="color:#000000">: </span><span style="color:#0000ff">true</span>
<span style="color:#000000">        }</span>
<span style="color:#000000">      ],</span>
      <span style="color:#0451a5">"preLaunchTask"</span><span style="color:#000000">: </span><span style="color:#a31515">"g++ build active file"</span><span style="color:#000000">,</span>
      <span style="color:#0451a5">"miDebuggerPath"</span><span style="color:#000000">: </span><span style="color:#a31515">"/usr/bin/gdb"</span>
<span style="color:#000000">    }</span>
<span style="color:#000000">  ]</span>
<span style="color:#000000">}</span></code></span>

program设置指定要调试的程序。在这里,它被设置为活动文件文件夹${fileDirname}和活动文件名,不带扩展名${fileBasenameNoExtension},如果helloworld.cpp是,则为活动文件helloworld

默认情况下,C ++扩展不会在您的源代码中添加任何断点,并且该stopAtEntry值设置为false。将stopAtEntry值更改true为会导致调试器main在启动调试时在该方法上停止。

其余步骤作为可选练习提供,以帮助您熟悉编辑和调试经验。

开始调试会话

  1. 返回到helloworld.cpp它是活动文件。
  2. F5或从主菜单中选择“运行”>“开始调试”。在开始逐步执​​行代码之前,让我们花一点时间注意用户界面中的一些更改:
  • 集成终端出现在源代码编辑器的底部。在“ 调试输出”选项卡中,您将看到指示调试器已启动并正在运行的输出。

  • 编辑器突出显示方法中的第一条语句main。这是C ++扩展自动为您设置的断点:

    初始断点

  • 左侧的“运行”视图显示调试信息。您将在本教程的后面看到一个示例。

  • 在代码编辑器的顶部,将显示一个调试控制面板。您可以通过抓住左侧的点在屏幕上移动它。

    调试控件

单步执行代码

现在,您准备开始逐步执​​行代码。

  1. 单击或按调试控制面板中的“ 跳过”图标。

    跳过按钮

    这会将程序执行推进到for循环的第一行,并跳过在创建和初始化变量时调用的vectorstring类内的所有内部函数调用msg。注意左侧“ 变量”窗口中的更改。

    调试窗口

    在这种情况下,将出现错误,因为尽管调试器现在可以看到循环的变量名,但该语句尚未执行,因此此时无任何内容可读取。的内容msg是可见的,但是,因为该声明已完成。

  2. 再次按Step over前进到该程序中的下一条语句(跳过为初始化循环而执行的所有内部代码)。现在,“ 变量”窗口显示有关循环变量的信息。

  3. 再次按Step over执行cout语句。(请注意,自2019年3月发行版起,直到循环退出,C ++扩展才将任何输出输出到调试控制台。)

  4. 如果愿意,可以继续按Step over,直到将引导程序中的所有单词都打印到控制台为止。但是,如果您感到好奇,请尝试按“ 跳入”按钮以逐步浏览C ++标准库中的源代码!

    gcc标准库标头中的断点

    要返回自己的代码,一种方法是按住“ 跳过”。另一种方法是在代码中设置断点,方法是切换到helloworld.cpp代码编辑器中的选项卡,将插入点放在cout循环内语句上的某个位置,然后按F9。在左侧的装订线中出现一个红点,指示已在此行上设置断点。

    主断点

    然后按F5键从标准库标题中的当前行开始执行。执行将中断cout。如果愿意,可以再次按F9键以关闭断点。

    循环完成后,您可以在集成终端的“ 调试控制台”选项卡中看到输出,以及GDB输出的一些其他诊断信息。

    调试控制台显示

设置手表

有时,您可能希望在程序执行时跟踪变量的值。您可以通过在变量上设置监视来做到这一点。

  1. 将插入点放在循环内。在“ 监视”窗口中,单击加号,然后在文本框中键入word,这是循环变量的名称。现在,当您逐步执行循环时,请查看“监视”窗口。

    观察窗

  2. 通过在循环之前添加此语句来添加另一只手表int i = 0;。然后,在循环中,加上这样一句话:++i;。现在,i像上一步一样添加手表。

  3. 要在断点处暂停执行时快速查看任何变量的值,可以使用鼠标指针悬停在其上。

    鼠标悬停

C / C ++配置

如果要对C / C ++扩展进行更多控制,则可以创建一个c_cpp_properties.json文件,该文件将允许您更改设置,例如编译器的路径,包含路径,C ++标准(默认为C ++ 17)等。

您可以通过运行命令C / C ++来查看C / C ++配置UI 从命令面板(Ctrl + Shift + P编辑配置(UI)。

命令面板

这将打开“ C / C ++配置”页面。当您在此处进行更改时,VS Code会将其写入到文件夹中称为c_cpp_properties.json.vscode文件中。

命令面板

仅当程序包含工作空间或标准库路径中没有的头文件时,才需要修改“ 包含路径”设置。

Visual Studio Code将这些设置放在中.vscode/c_cpp_properties.json。如果直接打开该文件,则它应如下所示:

<span style="color:#333333"><code><span style="color:#000000">{</span>
  <span style="color:#0451a5">"configurations"</span><span style="color:#000000">: [</span>
<span style="color:#000000">    {</span>
      <span style="color:#0451a5">"name"</span><span style="color:#000000">: </span><span style="color:#a31515">"Linux"</span><span style="color:#000000">,</span>
      <span style="color:#0451a5">"includePath"</span><span style="color:#000000">: [</span><span style="color:#a31515">"${workspaceFolder}/**"</span><span style="color:#000000">],</span>
      <span style="color:#0451a5">"defines"</span><span style="color:#000000">: [],</span>
      <span style="color:#0451a5">"compilerPath"</span><span style="color:#000000">: </span><span style="color:#a31515">"/usr/bin/gcc"</span><span style="color:#000000">,</span>
      <span style="color:#0451a5">"cStandard"</span><span style="color:#000000">: </span><span style="color:#a31515">"c11"</span><span style="color:#000000">,</span>
      <span style="color:#0451a5">"cppStandard"</span><span style="color:#000000">: </span><span style="color:#a31515">"c++17"</span><span style="color:#000000">,</span>
      <span style="color:#0451a5">"intelliSenseMode"</span><span style="color:#000000">: </span><span style="color:#a31515">"clang-x64"</span>
<span style="color:#000000">    }</span>
<span style="color:#000000">  ],</span>
  <span style="color:#0451a5">"version"</span><span style="color:#000000">: </span><span style="color:#098658">4</span>
<span style="color:#000000">}</span></code></span>

结束WSL会议

在WSL中完成工作后,可以使用主文件菜单和命令面板(Ctrl + Shift + P)中的“ 关闭远程连接”命令来关闭远程会话。这将重新启动在本地运行的VS Code。通过选择带有[WSL]后缀的文件夹,您可以从文件 > 打开最近的列表中轻松地重新打开WSL会话。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章