• [翻译]官网文档,ubuntu使用vscode调试c++


    Visual Studio Code官网文档 https://code.visualstudio.com/docs/cpp/config-wsl
    官网文档还有编译Python、Java的文档,包括win、linux、macos,写得很通俗,建议去看,flag:过四级的看不懂我倒立吃屏幕。
    徒手翻译原文,翻译人是直译翻译者的死对头,多处使用意译翻译。
    文档的很多内容可能用不到,结尾有总结,不想看翻译的请滚到最后看配置项及说明。

    官网文档翻译

    在WSL上用VS code写C++

    在这个教程中,你会在Windows Subsystem for Linux(WSL)的Ubuntu系统上配置VS code,来使用GCC编译工具和GDB调试工具。GCC代表GNU编译器集合;GDB是GNU的调试器。WSL是Windows系统上的Linux子系统,它直接在真机上运行,而不是虚拟机。

    注:教程的大部分内容可以直接在Linux设备上使用VS code做C++相关的工作。

    VS code支持在WSL内直接用Remote-WSL扩展进行工作。我们推荐使用WSL开发模式,所有源码文件还有编译器都由Linux发行版管理。更多信息详见VS Code Remote Development

    这个向导完成后,你将有能力创建并配置你的C++工程,并可以探索VS code的文档,获取更多关于它的特性的信息。此向导不会教你GCC、Linux或C++语言,关于这些问题的资源可以从网上获得很多。

    如果你有任何问题,请放心地在VS Code documentation repository为此教程提问。

    前提条件

    为了成功地完成此向导,你必须做下面几项工作:

    1. 安装VS code
    2. 安装Remote - WSL extension
    3. 安装Windows Subsystem for Linux,然后在页面链接上安装你选择的Linux发行版本。此教程使用Ubuntu。安装时务必记住你的Linux用户密码,因为在安装其他软件时需要它。

    设置你的Linux环境

    1. 打开WSL的Bash终端。如果你安装了一个Ubuntu发行版,在Windows搜索栏搜索“Ubuntu”然后在结果列表中点击它。对于Debian发行版,搜索“Debian”一样。

    终端会显示命令提示符,默认由你的用户名和电脑名组成,并将你至于用户的家目录下。在Ubuntu上看起来像这样:

    1. 创建一个目录projects,然后在其中创建子目录helloworld:
    mkdir projects
    cd projects
    mkdir helloworld
    
    1. 你将会在Linux系统用VS code编辑源代码,也会用g++编译器编译代码。同时,你也会在Linux中用GDB进行调试。这些工具在Ubuntu中默认不安装,所以你要亲自安装它们。幸运的是,这些工作很简单!

    2. 在WSL的命令提示符中,先运行apt-get update来更新Ubuntu的包列表。过时的版本有时会干扰新软件包的安装。

    sudo apt-get update
    

    你也可以执行sudo apt-get update && sudo apt-get dist-upgrade指令,下载最新版本的系统包,但是这会因为网络连接速度的约束而花费更多时间。

    1. 在命令行中安装GNU编译工具和GDB调试工具,命令如下:
    sudo apt-get install build-essential gdb
    
    1. 通过定位g++和gdb来核实安装是否成功。如果文件名没有在whereis命令中返回,试试再次运行更新命令。
    whereis g++
    whereis gdb
    

    注:安装g++编译器和GDB调试器的步骤在Linux设备上进行而不是WSL。你要在你的helloworld工程中运行VS code,以及编辑、编译和调试。

    在WSL中运行VS code

    在WSL的终端里切换到你的helloworld工程目录,用code .打开VS code:

    cd $HOME/projects/helloworld
    code .
    

    你会看到一条“安装VScode Server”的消息。这时VS code正在给Linux端下载并安装一个小服务器,桌面上的VS code会和它建立联系。随后VS code会启动并打开helloworld目录。文件管理器在标题栏显示[WSL:Ubuntu],代表VS code正在WSL中运行。

    你也可以在状态栏看到远程环境

    如果点击远程状态栏,你会看到远程命令会话的列表。比如,你想结束WSL上的会话,你就可以在列表中选择 关闭远端连接 命令。在WSL命令提示符中执行 code . 命令会重新启动VS code。

    code . 命令会在当前目录打开VS code,这个目录就是你的“工作空间”。随着教程的进行,你将看到在工作目录的.vscode目录中会创建三个文件:

    • c_cpp_properties.json(编译路径和智能配置)
    • tasks.json(编译说明)
    • launch.json(调试设置)

    添加源代码文件

    在文件管理标题栏上选择 新文件 按钮,创建一个 helloworld.cpp 文件。

    安装C/C++扩展

    创建文件后,VS code会识别出它是个C++语言的文件,如你没有安装Microsoft C/C++ extension,它会提示你进行安装。

    扩展窗口显示操作按钮,选择安装,然后重新加载,完成C/C++扩展的安装。

    如果你已经在VS code中本地安装了C/C++语言的扩展,你要在扩展扩展窗口(Ctrl+Shift+X)中把那些扩展安装到WSL中。选择 安装到WSL 按钮并 重新加载 ,本地安装的扩展就会安装到WSL上。

    添加helloworld源代码

    粘贴这段代码

    #include <iostream>
    #include <vector>
    #include <string>
    
    using namespace std;
    
    int main()
    {
       vector<string> msg {"Hello", "C++", "World", "from", "VS Code", "and the C++ extension!"};
    
       for (const string& word : msg)
       {
          cout << word << " ";
       }
       cout << endl;
    }
    

    Ctrl+S保存文件。在VS code侧边栏的 文件管理 窗口(Ctrl+Shift+E)中,注意你刚添加的文件是怎样显示的。

    你也可以打开自动保存功能,自动保存文件的改动,在 文件 主菜单中点击 自动保存

    你可以在最左侧的活动栏打开不同窗口,比如 搜索源代码管理运行 。在这个教程的后面你会看到 运行 窗口。你可以在VS code用户接口文档找到更多关于其他窗口的信息。

    智能提示

    在新建的 helloworld.cpp 文件中,把鼠标停在 vector 或者 string 上可以看到类型信息。声明 msg 变量后,你想调用它的成员函数就要以 msg. 开头。之后你会看到一个完整的列表显示所有成员函数,旁边还有一个窗口显示 msg 对象的类型信息。

    你可以按 Tab 键插入选择的成员函数;之后,当写上左括号时,你会看到该函数所有参数的信息。

    编译helloworld.cpp

    接下来,你要创建 tasks.json 文件,告诉VS code怎样编译程序。这个工作会借助WSL的g++编译器创建一个源代码的可执行文件。

    在主菜单栏选择 终端 > 配置默认生成任务 ,出现一个下拉列表,展示了各种预定义的C++编译器。选择 g++ build active file ,这个选项会创建一个在编辑器中立刻显示。

    这个步骤会在.vscode目录中创建一个tasks.json文件,并在编辑器中打开它。

    新创建的 tasks.json 文件应该像JSON格式,比如下面这样:

    {
      "version": "2.0.0",
      "tasks": [
        {
          "type": "shell",
          "label": "g++ build active file",
          "command": "/usr/bin/g++",
          "args": ["-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}"],
          "options": {
            "cwd": "/usr/bin"
          },
          "problemMatcher": ["$gcc"],
          "group": {
            "kind": "build",
            "isDefault": true
          }
        }
      ]
    }
    

    command选项指明要运行的程序,这个例子中时g++。 args数组指明要传给g++的命令行参数,这些参数的顺序必须符合编译器要求。这项工作是调用g++编译目标文件(${file}),并在当前目录(${fileDirname})创建一个没有文件后缀的、与目标文件同名的可执行文件,此教程中的例子创建helloworld文件。

    注:你可以在变量参考了解更多关于 tasks.json 的变量内容。

    label选项的值会在任务列表中显示,你可以任性地修改它。

    group对象中的"isDefault":true内容代表按Ctrl+Shift+B快捷键开始工作。这项配置只是为了方便;如果你把它设为false,你仍然可以在终端菜单中用运行生成任务来运行。

    运行编译

    1. 返回helloworld.cpp。你将编译helloworld.cpp

    2. Ctrl+Shift+B或者在终端主菜单中选择运行生成任务,运行定义在tasks.json文件的编译任务。

    3. 任务开始时,源代码编辑框下面会出现终端面板。编译完成后,终端会输出编译是否成功的相关信息。编译成功的样子像这样:

    1. 点击+按钮创建新终端,这个终端运行在WSL环境中,以helloworld文件的目录为工作目录。执行ls命令可以看到可执行文件helloworld(没有文件后缀)。

    1. 在终端输入./helloworld运行helloworld

    修改tasks.json

    你可以tasks.json来比编译更多C++文件,比如用".cpp"代替${file}。你也可以将${fileDirname}/${fileBasenameNoExtension}换成一个固定的名字来修改输出的文件名(比如改成“helloworld.out”)。

    调试helloworld.cpp

    接下来,你要创建一个launch.json文件来配置VS code,让它在你按F5时调用GDB调试程序。在主菜单选择运行 > 添加配置… 然后选择 C++(GDB/LLDB)

    出现一个列表显示各种预定义的调试配置。选择g++ build and debug active file

    VS code创建一个launch.json文件并在编辑器中打开,然后编译运行“helloworld”。

    {
      "version": "0.2.0",
      "configurations": [
        {
          "name": "g++ build and debug active file",
          "type": "cppdbg",
          "request": "launch",
          "program": "${fileDirname}/${fileBasenameNoExtension}",
          "args": [],
          "stopAtEntry": false,
          "cwd": "${workspaceFolder}",
          "environment": [],
          "externalConsole": false,
          "MIMode": "gdb",
          "setupCommands": [
            {
              "description": "Enable pretty-printing for gdb",
              "text": "-enable-pretty-printing",
              "ignoreFailures": true
            }
          ],
          "preLaunchTask": "g++ build active file",
          "miDebuggerPath": "/usr/bin/gdb"
        }
      ]
    }
    

    program选项指定要调试的程序。这里设置的目标文件目录${fileDirname}和无扩展名的目标文件${fileBasenameNoExtion}对应helloworld.cpp生成的目标文件helloworld

    这里默认,C++扩展不会源代码中添加任何断点,stopAtEntry的值为false。将stopAtEntry设为true会在开始调试时停在main函数位置。

    剩下的步骤时可选联系,可以帮助你熟悉编辑和调试。

    开始调试会话

    1. 返回helloworld.cpp,这是目前的目标文件。

    2. F5或主菜单选择运行 > 启动调试。在单步调试之前,我们用一分钟来了解一下用户界面的改变:

    • 代码编辑框下面出现终端。在调试控制台标签中,你可以看到调试器开始运行的输出信息。
    • 编辑器在main函数的第一行高亮显示。这是C++默认为你设置的断点:

    • 左侧运行窗口显示调试信息。在此向导的后面有例子。
    • 在编辑器顶部出现一个调试控制面板。你可以抓着左侧的几个点移动它。

    单步调试代码

    现在你可以准备开始单步调试代码了。

    1. 在调试控制面板上点击Step over图表。

    这会让程序执行到循环的第一行,并在创建和初始化msg变量时跳过vectorstring类的所有内部函数。注意左侧变量窗口的变化。

    这个例子中,理应会出现问题,虽然变量名对循环来说是可见的,但是还没有执行到,所以这一步没有内容可以读。msg变量可以看到,因为那条语句已经完成了。

    1. 再次按Step over让程序执行到下一个声明(跳过所有初始化循环的内部代码)。现在,变量窗口会展示循环中的变量信息。

    2. 再按Step over执行到cout语句。(注意,在2019年3月发行的VS code中,C++扩展在循环结束前不会在调试控制台输出任何信息。)

    3. 你可以一直按Step over直到向量中的所有单词都打印出来。如果你对Step Into按钮很好奇,可以点击它试一试,这会跳到C++标准库代码的内部!

    要想回到你的代码,一个方法是一直按Step over;另一个方法是切换到helloworld.cpp中,在程序循环内的cout语句处按F9添加断点。在左侧空白位置出现一个红点表明断点已添加到这一行。

    然后按F5在标准库中开始执行,程序会停在cout语句的位置。以可以再次按F9取消断点。

    循环结束后,在调试控制台可以看到输出信息,同时还有GDB的其他调试信息。

    设置监视器

    有时,你可能想在程序执行时跟踪变量的值。你可以为变量设置监听实现这一功能。

    1. 把光标聚焦在循环中,在监视窗口点击添加表达式然后输入循环的变量word。接下来,在调试时看着监视窗口。

    1. 在循环前加int i = 0;语句,在循环中添加++i语句,同上一步添加i变量的监视。

    2. 执行到断点时,如果想快速看到任何变量的值,你可以把鼠标停在它上面。

    C/C++配置

    如果你想对C/C++扩展进行更多控制,你可以创建一个c_cpp_properties.json文件,在其中可以配置很多设置,比如编译器路径、头文件包含路径和C++标准(默认C++17)等等。

    你可以在命令面板(Ctrl+Shift+P)运行C/C++: Edit Configurations (UI)命令打开C/C++用户界面配置。

    这会打开C/C++配置页面。当你在其中进行修改时,VS code会把修改内容写到.vscode目录的c_cpp_properties.json文件中。

    如果你的程序的头文件不再工作目录或标准库的头文件中,你只修改Include path就够了。

    VS code会将这些设置放到.vscode/c_cpp_properties.json文件中,如果直接打开它,它看起来像这样:

    {
      "configurations": [
        {
          "name": "Linux",
          "includePath": ["${workspaceFolder}/**"],
          "defines": [],
          "compilerPath": "/usr/bin/gcc",
          "cStandard": "c11",
          "cppStandard": "c++17",
          "intelliSenseMode": "clang-x64"
        }
      ],
      "version": 4
    }
    

    关闭WSL会话

    当你在WSL上完成工作后,你可以在主文件菜单和命令面板(Ctrl+Shift+P)执行关闭远程连接命令退出会话。这会重新启动运行在本地的VS code。你可以在文件 > 最近打开列表中选择带**[ WSL] **后缀的文件,重新打开WSL会话。

    其他步骤

    • 探索VS code用户导航
    • 回顾C++扩展概述
    • 创加一个新的工作空间,把你的.json文件复制到其中,为新的工作空间调整需要的设置,程序名等等,然后开始敲代码!

    配置总结

    文档讲的是在WSL上的ubuntu系统,不影响直接在ubuntu系统中进行配置。打开一个目录作为工作空间,设置时会在.vscode目录下创建两个文件tasks.json和launch.json。可以直接手动创建目录和文件,不用在VS code中设置。

    • 创建tasks.json文件,用于编译。菜单栏选择 终端 > 配置默认生成任务 ,出现一个下拉列表,展示了各种预定义的C++编译器。选择 g++ build active file。参考如下:
    {
        "version": "2.0.0",
        "tasks": [
          {
            "type": "shell",
            "label": "g++ go!go!go!",
            "command": "/usr/bin/g++",
            "args": [
              "-g",
              "${file}",
              "-o",
              "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "options": {
              "cwd": "/usr/bin"
            },
            "problemMatcher": [
              "$gcc"
            ],
            "group": {
              "kind": "build",
              "isDefault": true
            }
          }
        ]
      }
    

    command指明g++。args数组g++参数。当前文件目录${fileDirname}。无文件后缀的、与源文件同名的可执行文件${fileBasenameNoExtension}。label随便改。
    isDefault:true代表按Ctrl+Shift+B快捷键开始工作。详细内容参考Variables Reference

    • 创建launch.json文件,用于运行调试。主菜单选择运行(调试) > 添加配置… 然后选择 C++(GDB/LLDB)。选g++ build and debug active file。launch.json参考:
    {
        // 使用 IntelliSense 了解相关属性。
        // 悬停以查看现有属性的描述。
        // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
        "version": "0.2.0",
        "configurations": [
            {
                "name": "come on!",
                "type": "cppdbg",
                "request": "launch",
                "program": "${workspaceFolder}/${fileBasenameNoExtension}",
                "args": [],
                "stopAtEntry": false,
                "cwd": "${workspaceFolder}",
                "environment": [],
                "externalConsole": false,
                "MIMode": "gdb",
                "setupCommands": [
                    {
                        "description": "为 gdb 启用整齐打印",
                        "text": "-enable-pretty-printing",
                        "ignoreFailures": true
                    }
                ]
            }
        ]
    }
    

    program选项指定要调试的程序。

    之后就能编译、调试了。调试前记得先编译源文件。

  • 相关阅读:
    html5_css 3 学习指南__转
    MySQL常见故障处理手册_转
    MYSQL出错代码列表——转
    Redhat 6环境下安装Oracle 12c的方法
    Wireshark入门:分析DHCP协议的运行
    重命名Oracle数据库的表空间(Renaming a Tablespace)
    Oracle DB 分区特性概述 Overview of Partitions
    Oracle Database Concepts:介绍模式对象(Introduction to Schema Objects)
    Supporting Connected Routes to Subnet Zero
    Secondary IP Addressing
  • 原文地址:https://www.cnblogs.com/foxer-z/p/12520904.html
Copyright © 2020-2023  润新知