首页 > 编程语言 >VSCode编译运行和调试C++

VSCode编译运行和调试C++

时间:2024-08-01 23:19:14浏览次数:7  
标签:VSCode helloworld 编译 json C++ cpp vscode

VSCode编译运行和调试C++

欢迎关注我的B站:https://space.bilibili.com/379384819

欢迎交流学习,vx:18074116692

参考教程:

详解Linux下使用vscode编译运行和调试C/C++ - 知乎 (zhihu.com)

vscode是文本编辑而非集成开发环境,需要经过配置才能在其上编译执行代码。本教程将介绍如下内容

(1)在linux配置Visual Studio Code使用GCC C++编译器(g++)和GDB调试器的方法(GCC是GNU编译器集合,GDB则是GNU调试器)。

(2)配置vscode后,将通过在VSCode中编译和调试一个简单的C++程序。

1. 先决条件

1.1 安装vscode

VSCode 下载地址:https://code.visualstudio.com/docs?start=true

历史版本下载链接: https://code.visualstudio.com/updates

选择中间 Linux 系统下的各种版本进行下载,注意要根据自己的硬件设备选择 X64Arm32Arm64 版本。若硬件是因特尔(X86 架构)则选 x64.deb 文件进行下载,若硬件是树莓派(ARM 架构)则后两者任选即可。

1.2 安装C++扩展

点击在vscode界面最左侧的Extensions图标(打开快捷键:ctrl+shift+X),搜索“C/C++”,点击进行安装。

1.3 安装gcc

确保已安装gcc。一般ubuntu系统会预装gcc.在终端窗口中输入如下命令以检验是否已安装gcc。

rosnoetic@rosnoetic-VirtualBox:~$ **g++ --version**

如果能够正确打印出当前gcc的版本信息,则表示已经预装。若没有预装,则用如下命令安装安装 GNU 编译器工具和 GDB 调试器:

rosnoetic@rosnoetic-VirtualBox:~$ **sudo apt-get update**

rosnoetic@rosnoetic-VirtualBox:~$ **sudo apt-get install build-essential**

2. Hello World

2.1 创建文件夹

通过终端创建一个名为project的文件夹以保存我们的VSCode项目,并创建子文件夹helloworld,在project/helloworld目录下打开vscode。

rosnoetic@rosnoetic-VirtualBox:~$ **mkdir project && cd project**

rosnoetic@rosnoetic-VirtualBox:~/project$ **mkdir helloworld && cd helloworld**

rosnoetic@rosnoetic-VirtualBox:~/project/helloworld$ **code .**

项目的配置文件位于.vscode文件夹下。在后续教程中,将具体说明在vscode中如何操作生成.vscode 文件夹下的三个配置文件:

tasks.json (compiler build settings) ,负责编译
launch.json (debugger settings),负责调试

c_cpp_properties.json (compiler path and IntelliSense settings),负责更改路径等设置

当然,也可以直接复制配置文件中的内容,以新建文件的方式生成配置文件。后续会对文件中的一些重要关键字进行解读,了解配置文件中内容的具体作用。

2.2 编写源代码

新建文件helloworld.cpp

在helloworld.cpp粘贴如下代码并保存(Ctrl+S),在vscode左侧栏的Explorer视图中可以看到新建的文件helloworld.cpp。

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main()
{
    vector<string> msg {"hello","C++"};
    for (const string& word : msg)
    {
        cout << word <<" ";
    }
    cout << endl;
}

2.3 编译 Build helloworld.cpp

2.3.1 创建 tasks.json(构建编译程序

在.vscode下创建tasks.json文件,它的作用是告诉 VS Code 如何构建(编译)程序,将调用 g++编译器从源代码创建一个可执行文件。 在上方的主菜单中,选择 终端>配置默认生成任务,将出现一个下拉菜单,显示 C++ 编译器的各种预定义编译任务。选择 C/C++: g++ 生成活动文件

上述操作将自动在.vscode文件夹下生成tasks.json文件。当然也可以在Explorer视图中新建文件,将下面代码复制进去,手动生成tasks.json,教程后面的配置文件也均可这样生成。其中代码类似如下:

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

注: VScode支持使用 ${variableName} 语法在配置文件中实现键值字符串的变量替换。tasks.json及后面为调试创建的launch.json文件中变量的具体说明可参考variable reference.

tasks.json中部分关键字说明:

command: 要运行的程序,此处是g++。

args: args 数组包含将传递给 g++ 的命令行参数(必须按照编译器预期的顺序指定)。"${file}"表示当前打开的待编译的活动文件,对它进行编译,并在当前路径${fileDirname}生成与活动文件同名无后缀的可执行文件"${fileDirname}/${fileBasenameNoExtension}"。在本案例中活动文件指helloworld.cpp,所生成的可执行文件为helloworld。

label: 标签值是将在任务列表中看到的内容;可以随意命名它。

group中的isDefault: 值为true表示支持通过快捷键ctrl+shift+B来执行该编译任务。如果值改为false,也可以从菜单中选择运行:终端>运行生成任务

2.3.2 执行编译

(1)回到活动文件helloworld.cpp

(2)执行tasks.json中定义的编译任务。快捷键ctrl+shift+B或者从菜单中选择运行:终端>运行生成任务

(3)任务开始时,源代码编辑器下方将出现集成终端面板。任务执行完成后,终端会显示编译结果,对于成功的 g++编译,输出类似如下:

(1)如下图,点击+按钮将创建一个以当前工作目录(本案例中是helloworld)默认运行的shell终端。输入指令ls查看当前目录下所有文件,可以看到编译生成的可执行文件helloword。

(5)终端中输入 ./helloworld ,即可运行可执行文件helloworld

修改tasks.json

可以修改 tasks.json来满足一些特定需求。比如 将"${file}"替换“${workspaceFolder}/*.cpp”来构建多个 C++ 文件; 将“${fileDirname}/${fileBasenameNoExtension}”替换为硬编码文件名(如“helloworld.out”)来修改输出文件名。

2.4 调试Debug helloworld.cpp

2.4.1 创建launch.json

launch.json 文件用于在 Visual Studio Code 中配置调试器。接下来将创建launch.json 文件。

从主菜单中,选择 运行> 添加配置...,在创建的launch.json文件中,覆盖如下内容:

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [

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

launch.json中部分关键字说明:

program: 指待调试的程序,其值对应程序的路径。在这里设置为"${fileDirname}/${fileBasenameNoExtension}",在本案例中对应“helloworld/helloworld”。

stopAtEntry: 默认情况下,C++拓展不会向源代码添加任何断点,stopAtEntry 值设置为 false。

接着将stopAtEntry值更改为 true 将使调试器在开始调试时停止在 main 方法上。

2.4.2 开始一个调试会话

(1)返回 helloworld.cpp 使其成为活动文件

(2)按 F5 或从主菜单中选择 运行> 启动调试。用户界面的几个变化: 集成终端出现在源代码编辑器的底部,在“Debug Output”选项卡中,会看到指示调试器已启动并正在运行的输出。编辑器突出显示 main 方法中的第一条语句。这是 C++拓展自动设置的断点。

左侧的运行视图显示调试信息,后面有示例。 在代码编辑器的顶部,会出现一个调试控制面板。可以通过抓住左侧的点在屏幕上移动它。

2.4.3 逐步执行代码

(1)单击调试控制面板中的 Step over 图标或者按F10。将程序执行推进到 for 循环的第一行,并跳过创建和初始化 msg 变量时调用的 vector 和 string 类中的所有内部函数调用。留意侧面“变量”窗口中的变化:

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

(3)再次按 Step over 执行 cout 语句。 (注意:从 2019年3 月的版本开始,C++ 扩展在最后一次 cout 执行之前不会将任何输出打印到调试控制台。)

(4)你可以一直按 Step over 直到向量中的所有单词都被打印到控制台。如果您感到好奇,可以尝试按 Step Into 按钮来逐步浏览 C++ 标准库中的源代码。

可以一直按Step over以返回到自己的代码。另一种方法是在代码中设置断点,方法是切换到代码编辑器中的 helloworld.cpp,比如在循环内cout语句处设置断点,将鼠标放置于该行上,按 F9,最左边将出现一个红点,表示该行已设置断点。(也可用鼠标点击代码行的最左侧来设置断点,再次单击或者按F9将取消断点)

然后按 F5 从标准库头文件中的当前行开始执行。执行将在 cout 中断。 循环完成后,可在集成终端的调试控制台选项中看到输出,以及 GDB 输出的一些其他诊断信息。

2.4.4 设置监视watch

要在程序执行时跟踪变量的值,可以对变量设置监视(watch)。

(1)将插入点放在循环内。在 Watch 窗口中,单击加号,然后在文本框中键入循环变量的名称 word。在逐步执行循环时查看 Watch 窗口,可看到word值的变化。

(2)断点处暂停执行时,将鼠标指针悬停在变量上可快速查看该变量的值。

2.5 C/C++配置

如果你想更多地控制 C/C++ 扩展,你可以创建一个 c_cpp_properties.json 文件,它允许你更改设置,例如编译器的路径、包含路径、C++ 标准(默认为 C++17),等等。 您可以通过从命令面板 (Ctrl+Shift+P) 运行命令 C/C++: Edit Configurations (UI) 来查看 C/C++ 配置 UI。(这时.vscode下会自动生成c_cpp_properties.json 文件)

之后上述操作将打开 C/C++ Configurations页面。当您在此处进行更改时,VSCode 会将它们写入 .vscode 文件夹中名为 c_cpp_properties.json 的文件。

如果您的程序包含不在您的工作区或标准库路径中的头文件,您只需要修改包含路径Include path 设置。Visual Studio 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
}

上述操作已配置好用vscode在 Linux上使用 gcc。该配置适用于当前工作空间。 要重用配置,只需将对应的JSON 文件复制到新项目文件夹(工作区)中的 .vscode 文件夹,并根据需要更改源文件和可执行文件的名称。

标签:VSCode,helloworld,编译,json,C++,cpp,vscode
From: https://www.cnblogs.com/windandchimes/p/18337773

相关文章

  • C++和C语言if else
    一、if。if(/*表达式*/)//如果表达式成立,执行大括号里的代码。如果表达式不成立,执行大括号下面的代码。{//代码}二、else。 else//else一般和if配对,如果if表达式不成立,执行else。如果if表达式成立,不执行else{//代码} 所以执行如上代码输出的是"1是单数"。......
  • mac 源码编译安装php8.3.9
    前提条件确保你已经安装了Homebrew和XcodeCommandLineTools。你可以通过以下命令安装它们:/bin/zsh-c"$(curl-fsSLhttps://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"xcode-select--installhttps://www.cnblogs.com/niuben/p/16109703.html安装必要......
  • C++入门基础
    文章目录一、C++的由来1、C++的起源2、C++的版本更新二、C++的第一个程序三、命名空间1、namespace的价值2、namespace的定义3、命名空间的使用四、C++输⼊&输出五、缺省参数六、函数重载七、引用1、引用的概念和定义一、C++的由来1、C++的起源C++的起源可......
  • Log4cplus导入QT5(VSCode)
    下载GitHub地址:https://github.com/log4cplus/log4cplus版本选择log4cplus-2.0.2编译环境搭建完成后即可CMake编译生成预编译库,可参考该项目README.md进行功能选择导入在实际工程CMakeLists.txt中导入头文件(库include目录),并链接预编译好的.dll文件到项目中运行及调试la......
  • C++类的组合和类的继承的区别
    C++类的组合和类的继承的区别类的组合:类的组合是一种将一个类的对象作为另一个类的成员变量的设计方式。classEngine{public:Engine(){/*...*/}~Engine(){/*...*/}};classCar{private:Engineengine;//Engine的构造函数和析构函数将被调用......
  • C++深拷贝和浅拷贝的区别
    C++深拷贝和浅拷贝的区别#include<iostream>#include<cstring>usingnamespacestd;classstudent{public:student(constchar*name,intage);//声明构造函数~student();//析构函数//如果没有定义拷贝构造函数,编译器就自动生成默认拷贝构造函数:浅拷贝......
  • 行李托运问题(c++实际问题专题1)
    大家好,小编今天给大家带来一个问题,这个问题出题方法也比较实用。先看一下题干: 这道题目其实分一下货物的类型就行了,<=10的算一类,>10的算一类,这样在分别算出就行,先算<=10的:if(n<=10)cout<<fixed<<setprecision(2)<<2.5;//注意,这里需要用fixed-setpresicion函数......
  • C++ STL adjacent_difference 用法
    一:功能    计算相邻两个元素的差(默认),也可以使用其他自定义运算函数,比如计算相邻两个元素的和。二:用法#include<iostream>#include<vector>#include<numeric>intmain(){std::vector<int>data{2,3,5,7,11,13};//前两个参数指定输入的范围,第......
  • C++-入门(下)
    一、前言:目标:1.C++关键字2.命名空间3.C++输入&输出4.缺省参数5.函数重载6.引用7.内联函数8.auto关键字(C++11)9.基于范围的for循环(C++11)10.指针空值---nullptr(C++11)二、目标的实现:6.引用:6.1引用概念:        引用不是新定义一......
  • vscode 上传github
    0安装github插件 插件   1登录https://github.com/Dongvdong?tab=repositories105@qL42创建2-1项目名字 2-2选择一个默认的redeme 2-3公开还是私有 完整提交   3Git首次安装需要进行的设置gitconfig--list2、配置全局用......