在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文档库中提交本教程的问题。
先决条件
要成功完成本教程,您必须执行以下步骤:
-
安装Visual Studio代码。
-
安装Remote-WSL扩展。
-
安装适用于Linux的Windows子系统,然后使用同一页面上的链接安装您选择的Linux发行版。本教程使用Ubuntu。在安装过程中,请记住您的Linux用户密码,因为安装其他软件将需要它。
设置您的Linux环境
-
打开WSL的Bash shell。如果安装了Ubuntu发行版,请在Windows搜索框中键入“ Ubuntu”,然后在结果列表中单击它。对于Debian,键入“ Debian”,依此类推。
该外壳将显示一个命令提示符,默认情况下该命令提示符由您的用户名和计算机名组成,并将您置于主目录中。对于Ubuntu,它看起来像这样:
-
创建一个目录
projects ,然后在该目录下创建一个子目录helloworld :1
2
3<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> -
尽管将使用VS Code编辑源代码,但是您将使用g ++编译器在Linux上编译源代码。您还将使用GDB在Linux上进行调试。这些工具默认未在Ubuntu上安装,因此您必须安装它们。幸运的是,该任务非常简单!
-
在WSL命令提示符下,首先运行
apt-get update 以更新Ubuntu软件包列表。过时的发行版有时会干扰尝试安装新软件包。1<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 以下载系统软件包的最新版本,但这可能会花费更长的时间,具体取决于您的连接速度。 -
在命令提示符下,键入以下命令来安装GNU编译器工具和GDB调试器:
1<span style="color:#333333"><code><span style="color:#000000">sudo apt-get install build-essential gdb</span></code></span> -
通过找到g ++和gdb来验证安装是否成功。如果没有从
whereis 命令返回文件名,请尝试再次运行update命令。1
2<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
1 2 | <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将启动并打开
您还可以从状态栏中告诉远程上下文。
如果单击“远程状态”栏项目,将看到适合该会话的“远程”命令的下拉列表。例如,如果要结束在WSL中运行的会话,则可以从下拉列表中选择“ 关闭远程连接”命令。运行
该代码。命令在当前工作文件夹中打开了VS Code,这将成为您的“工作区”。在学习本教程的过程中,您将看到
c_cpp_properties.json (编译器路径和IntelliSense设置)tasks.json (制作说明)launch.json (调试器设置)
添加源代码文件
在文件资源管理器标题栏中,选择“ 新建文件”按钮并命名该文件
安装C / C ++扩展
创建文件并且VS Code检测到它是C ++语言文件后,如果尚未安装Microsoft C / C ++扩展名,则可能会提示您安装它。
在“扩展”视图中显示按钮时,选择“ 安装”,然后选择“ 需要重新加载”以完成C / C ++扩展的安装。
如果您已经在VS Code中本地安装了C / C ++语言扩展,则需要转到“扩展”视图(Ctrl + Shift + X)并将这些扩展安装到WSL中。通过选择“ 在WSL中安装”按钮,然后选择“ 需要重新加载”,可以将本地安装的扩展安装到WSL中。
添加Hello World源代码
现在粘贴此源代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <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 用户界面文档中找到有关其他视图的更多信息。
探索智能感知
在新
您可以按Tab键插入选定的成员。然后,当您添加左括号时,您将看到有关该函数所需的任何参数的信息。
编译helloworld.cpp
接下来,您将创建一个
在主菜单中,选择Terminal > Configure Default Build Task。在下拉列表中,将显示任务下拉列表,其中列出了C ++编译器的各种预定义构建任务。选择g ++ build active file,它将构建当前在编辑器中显示(活动)的文件。
这将
您的新
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <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> |
该
注意:您可以
task.json 在变量参考中了解有关变量的更多信息。
该
对象中的
运行构建
-
回到
helloworld.cpp 。您的任务将生成活动文件,并且您要生成helloworld.cpp 。 -
要运行中定义的构建任务
tasks.json ,请按Ctrl + Shift + B或从“ 终端”主菜单中选择“ 任务:运行构建任务”。 -
任务启动时,您应该看到“集成终端”面板出现在源代码编辑器下方。任务完成后,终端将显示编译器的输出,指示构建成功还是失败。对于成功的g ++构建,输出看起来像这样:
-
使用+按钮创建一个新终端,您将在WSL上下文中运行一个bash终端,并将
helloworld 文件夹作为工作目录。运行ls ,您现在应该看到可执行文件helloworld (没有文件扩展名)。 -
您可以
helloworld 在终端中输入来运行./helloworld 。
修改task.json
您可以
调试helloworld.cpp
接下来,您将创建一个
然后,您将看到各种预定义调试配置的下拉列表。选择g ++构建并调试活动文件。
VS Code创建一个
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <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> |
该
默认情况下,C ++扩展不会在您的源代码中添加任何断点,并且该
其余步骤作为可选练习提供,以帮助您熟悉编辑和调试经验。
开始调试会话
- 返回到
helloworld.cpp 它是活动文件。 - 按F5或从主菜单中选择“运行”>“开始调试”。在开始逐步执??行代码之前,让我们花一点时间注意用户界面中的一些更改:
-
集成终端出现在源代码编辑器的底部。在“ 调试输出”选项卡中,您将看到指示调试器已启动并正在运行的输出。
-
编辑器突出显示方法中的第一条语句
main 。这是C ++扩展自动为您设置的断点: -
左侧的“运行”视图显示调试信息。您将在本教程的后面看到一个示例。
-
在代码编辑器的顶部,将显示一个调试控制面板。您可以通过抓住左侧的点在屏幕上移动它。
单步执行代码
现在,您准备开始逐步执??行代码。
-
单击或按调试控制面板中的“ 跳过”图标。
这会将程序执行推进到for循环的第一行,并跳过在创建和初始化变量时调用的
vector 和string 类内的所有内部函数调用msg 。注意左侧“ 变量”窗口中的更改。在这种情况下,将出现错误,因为尽管调试器现在可以看到循环的变量名,但该语句尚未执行,因此此时无任何内容可读取。的内容
msg 是可见的,但是,因为该声明已完成。 -
再次按Step over前进到该程序中的下一条语句(跳过为初始化循环而执行的所有内部代码)。现在,“ 变量”窗口显示有关循环变量的信息。
-
再次按Step over执行
cout 语句。(请注意,自2019年3月发行版起,直到循环退出,C ++扩展才将任何输出输出到调试控制台。) -
如果愿意,可以继续按Step over,直到将引导程序中的所有单词都打印到控制台为止。但是,如果您感到好奇,请尝试按“ 跳入”按钮以逐步浏览C ++标准库中的源代码!
要返回自己的代码,一种方法是按住“ 跳过”。另一种方法是在代码中设置断点,方法是切换到
helloworld.cpp 代码编辑器中的选项卡,将插入点放在cout 循环内语句上的某个位置,然后按F9。在左侧的装订线中出现一个红点,指示已在此行上设置断点。然后按F5键从标准库标题中的当前行开始执行。执行将中断
cout 。如果愿意,可以再次按F9键以关闭断点。循环完成后,您可以在集成终端的“ 调试控制台”选项卡中看到输出,以及GDB输出的一些其他诊断信息。
设置手表
有时,您可能希望在程序执行时跟踪变量的值。您可以通过在变量上设置监视来做到这一点。
-
将插入点放在循环内。在“ 监视”窗口中,单击加号,然后在文本框中键入
word ,这是循环变量的名称。现在,当您逐步执行循环时,请查看“监视”窗口。 -
通过在循环之前添加此语句来添加另一只手表
int i = 0; 。然后,在循环中,加上这样一句话:++i; 。现在,i 像上一步一样添加手表。 -
要在断点处暂停执行时快速查看任何变量的值,可以使用鼠标指针悬停在其上。
C / C ++配置
如果要对C / C ++扩展进行更多控制,则可以创建一个
您可以通过运行命令C / C ++来查看C / C ++配置UI :从命令面板(Ctrl + Shift + P)编辑配置(UI)。
这将打开“ C / C ++配置”页面。当您在此处进行更改时,VS Code会将其写入到文件夹中称为
仅当程序包含工作空间或标准库路径中没有的头文件时,才需要修改“ 包含路径”设置。
Visual Studio Code将这些设置放在中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <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会话。