手把手教你使用 VS Code 编译和调试 C/C++ 工程

本文以 Ubuntu 系统为例,介绍如何在 VS Code 上配置 C/C++ 的编译环境,并把工程运行、调试起来。

准备工作

安装编译器

首先需要安装编译器。因为 VS Code 只是一个代码编辑器,没有自带有 C/C++ 的编译器,因此我们需要安装一个 C/C++ 编译器,打开终端依次输入,确保安装好 gcc、g++ 和 gdb 等工具。

sudo apt install gcc g++ gdb

安装插件

然后,还需要在 VS Code 中安装 C/C++ 扩展,打开 Extensions 视图(快捷键:Ctrl + Shift + X),搜索并安装 “C/C++” 扩展。

下载示例工程

本示例完整工程代码可在 GitHub 获取,下面展示 main 函数部分。在这个示例中有两个线程,一个线程生产随机数字并将其放入队列,另一个线程从队列中取出数字并打印。程序可以接收一个数字参数,用于设置随机数的最大值(默认是 100)。

int main(int argc, char *argv[])
{if (argc > 1) {rangeMax = std::stoi(argv[1]);}// 设置随机数种子std::srand(std::time(0));// 启动生产者线程和消费者线程std::thread producer(producerThread);std::thread consumer(consumerThread);// 等待线程结束producer.join();consumer.join();return 0;
}

配置文件

想要在 VS Code 中运行和调试 C/C++ 程序,涉及三个配置文件:tasks.json、launch.json 和 c_cpp_properties.json。这三个配置文件一起提供了一个完整的 C/C++ 开发环境的配置。

  • tasks.json 文件用于配置任务(例如编译)
  • launch.json 文件用于配置调试器
  • c_cpp_properties.json 文件用于配置 IntelliSense 功能

通过配置这些文件,你可以在 VS Code 中方便地进行 C/C++ 项目的编译和调试。(参考《VS Code 配置文件》)

tasks.json

对于一个新的工程,首先需要创建 tasks.json 文件。点击左侧 “Run and Debug” 按钮打开运行和调试窗口,点击蓝色的“运行和调试”按钮,选择 “C++ (GDB/LLDB)” 调试器。

在这里会列出你的系统中已经安装的 C/C++ 编译器,选择你需要的即可。

现在,你可以看到在当前工程的 .vscode 目录下多了一个 tasks.json 文件。该文件包含用于编译的命令、编译器的地址、与 launch.json 中相同的标签以及其他一些信息等。

由于这里使用了多线程,因此需要添加 -lpthread 链接库信息,以下是修改后的 task.json 文件:

{"tasks": [{"type": "cppbuild", // 任务执行的类型是 cppbuild"label": "C/C++: g++ 生成活动文件", // 任务的名字"command": "/usr/bin/g++","args": ["-fdiagnostics-color=always","-g","${file}", // 当前文件名"-o","${fileDirname}/${fileBasenameNoExtension}", // 当前文件名(去掉扩展名)"-lpthread"],"options": {"cwd": "${fileDirname}"},"problemMatcher": ["$gcc" // 使用 gcc 捕获错误],"group": {"kind": "build","isDefault": true// 任务分组,因为是 tasks 而不是 task,意味着可以连着执行很多任务。// 如果任务分组是 build,可以用 `run build task` 来运行。// 如果任务分组是 test,可以用 `run test task` 来运行。},"detail": "调试器生成的任务。"}],"version": "2.0.0"
}

tasks.json 中的字段大多数可以不太关注,但是唯独要特别注意的是,tasks.json 的 label 必须与 launch.json 的 preLaunchTask 匹配。并且它是区分大小写的,在 launch.json 中会调用这个名字。更具体来说:

  • label:这是 tasks.json 文件所特有的,launch.json 使用它在执行之前调用 tasks.json。

  • command:指向 g++ 编译器应用程序,因为在编译过程中需要用到它。

  • args:这些参数与命令连接起来后就是用于编译 cpp 文件和创建可执行文件的命令,例如:

    g++ -std=c++11 -O2 -Wall ${file} -o ${fileDirname}\\${fileBasenameNoExtension}.exe
    

launch.json

接着,需要创建 launch.json 文件。点击左侧 “Run and Debug” 按钮打开运行和调试窗口,点击 “创建 launch.json 文件” 链接,选择 “C++ (GDB/LLDB)” 调试器。

此时,在 .vscode 目录中会创建出一个 launch.json 文件,内容如下:

{// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387"version": "0.2.0","configurations": []
}

实际上,这个时候按 F5 键就可以开始编译并进入调试模式。但是为了更细致地配置工程,我们来设置 launch.json 文件的配置项,涉及调试器的名称、调试器的路径、当前 cpp 文件的目录以及有关数据的控制台等信息。下面是配置完成后的 launch.json 文件内容:

{"version": "0.2.0","configurations": [{"name": "Launch","preLaunchTask": "C/C++: g++ 生成活动文件","type": "cppdbg","request": "launch","program": "${fileDirname}/${fileBasenameNoExtension}","args": ["1000"],"stopAtEntry": false,"cwd": "${workspaceFolder}","environment": [],"externalConsole": false,"MIMode": "gdb","miDebuggerPath": "/usr/bin/gdb","setupCommands": [{"description": "Enable pretty-printing for gdb","text": "-enable-pretty-printing","ignoreFailures": true}]}]
}

注意:preLaunchTask 项一定要与 tasks.json 中的任务名称一致。另外,第 10 行设置了启动程序的参数,我们传入了 1000 作为随机数的最大值。

你可以完全使用上面给出的代码,也可以使用机器中自动生成的代码。下面是一些比较重要的选项说明:

  • nametype:分别指定 launch.json 的名称和类型。
  • preLaunchTask:设定 tasks.json 文件的任务名称(可能会有多个任务)。
  • request:指明 JSON 文件的类型。
  • program:指明程序的具体路径。
  • cwd:表示当前工作目录。请注意,launch.json 文件中的所有地址都是通用形式,它们不特定于任何文件。
  • externalConsole:是否使用外部控制台,如果是 true,则启动外部控制台,否则使用 VS Code 的集成终端。
  • miDebuggerPath:指明调试器的位置,这个也是因用户而异的。

c_cpp_properties.json

c_cpp_properties.json 文件不是必须的,主要用于配置 C/C++ 扩展的 IntelliSense 设置,指定编译器路径、标准库路径、头文件路径、宏定义等信息。它影响的是编辑器对代码的智能提示、语法检查等功能,而不是编译任务。

创建 c_cpp_properties.json 文件的方法是:通过快捷键 Ctrl + Shift + P 打开执行命令的输入框,输入 “C/C++”,选择 “C/C++: 编辑配置(JSON)”。

在我的 Ubuntu 系统中,生成的默认配置如下:

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

运行调试

完成前面的准备工作后,就可以开始运行调试代码了。点击左侧 “Run and Debug” 按钮打开运行和调试窗口,点击窗口上方 Launch 旁边的绿色小三角按钮开始调试(也可以直接按 F5 键进入调试模式)。

你可以在你想要停下了的地方打上断点,例如 main 函数入口。此时,调试器会在断点处暂停,你可以在左侧的窗口中查看变量的值、调用堆栈等信息。

通过 VS Code 上方的调试控制面板可以控制程序执行过程,例如单步执行、单步调试、单步跳出等。这样,你的 C/C++ 工程就调试起来啦!

提示:掌握 VS Code 快捷键 可以提高调试效率。

参考资料

  • Debugging in Visual Studio Code
  • Configure launch.json for C/C++ debugging in Visual Studio Code

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/412650.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MATLAB源码-第115期】基于matlab的QSM正交空间调制系统仿真,输出误码率曲线。

操作环境: MATLAB 2022a 1、算法描述 正交空间调制(QSM)是一种先进的无线通信技术,它通过利用发射端的多天线阵列来传输信息,从而提高了数据传输的效率和速率。这种技术的关键在于它使用天线阵列的空间特性来编码额…

MATLAB | 龙年大吉,使用MATLAB绘制会动的中国风神龙

hey各位好久不见,龙年到了,这期画一期配色非常中国风的龙,这个造型的龙参考了某些html绘制龙的视频,但是由于html版全网都是也不咋给代码和代码出处,因此自己写了个MATLAB版本: 可以看到还是非常酷炫的&…

python数字图像处理基础(六)——模板匹配、直方图

目录 模板匹配概念单对象模板匹配多对象模板匹配 直方图1.查找直方图2.绘制直方图3.掩膜的应用 模板匹配 概念 模板匹配和卷积原理很像,模板在原图像上从原点开始滑动,计算模板与图像被模板覆盖的地方的差别程度,这个差别程度的计算方法在o…

ubuntu开放ssh服务

📑前言 本文主要是【ubuntu】——ubuntu开放ssh服务的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 🌄每日一…

AIOps案例 | 携手擎创,中邮信科成功打造新一代IT智能运维平台,收益明显!

为推动邮政信息科技体制改革、提升信息科技自主供给能力,在原信息技术局、数据中心和软开中心基础上,中邮信息科技(北京)有限公司(简称“中邮信科公司”)经中国邮政集团有限公司于2019年5月被批准成立。 公司主要负责邮政各类信息…

【​电力电子在电力系统中的应用​】6 滞环电流控制的PWM整流器 + STATCOM整流器 + APF仿真

【仅供参考】 【2023.06西南交大电力电子在电力系统中的应用】 目录 步骤一:基于滞环电流控制的PWM整流器仿真 1.1 仿真要求 1.2 仿真电路原理及设计 1.2.1 主电路的搭建 1.2.2 控制电路的搭建 1.3 波形分析 步骤二:从PWM整流器到STATCOM仿真 2…

12.云原生之kubesphere中应用部署方式

云原生专栏大纲 文章目录 k8s中应用部署Kubernetes常用命令 kubesphere中可视化部署应用创建工作负载服务暴露 helm部署应用helm命令行部署应用kubesphere中使用应用仓库 k8s中应用部署 在k8s中要想部署应用,需要编写各种yaml文件,一旦应用依赖比较复杂…

第七在线荣获百灵奖 Buylink Awards 2023零售圈年度卓越服务商品牌

1月11日,由零售圈主办、20零售连锁协会协办、30零售行业媒体支持的中国零售圈大会暨2024未来零售跨年盛典在西安落下帷幕,在这个零售行业盛典中,第七在线凭借其高精尖产品和卓越的服务质量成功入选,并荣获了“百灵奖 Buylink Awar…

关于接口的安全性测试,这方法你学会了吗?

01、接口防刷 1.为什么会有人要刷接口? 牟利:黄牛在 12306 网上抢票再倒卖。 恶意攻击竞争对手:如短信接口被请求一次,会触发几分钱的运营商费用,当量级大了也很可观。 压测:用apache bench 做压力测试…

零基础也能轻松安装Linux系统,快速入门指南!

本章节我们将为大家介绍 Linux 的安装,安装步骤比较繁琐,现在其实云服务器挺普遍的,价格也便宜,如果自己不想搭建,也可以直接买一台学习用用,参考各大云服务器比较。 本章节以 centos6.4 为例。 centos 下…

Springboot智慧校园电子班牌统一管理平台源码

借助AIoT智能物联、云计算技术打造智慧绿色校园,助力实现校园教务管理、教师管理、学籍管理、考勤、信息发布、班级文明建设、校园风采、家校互通等场景功能,打造安全、便捷、绿色的智慧校园。 前后端分离架构 1、使用springbootvue2 2、数据库&#xff…

CAD随机锈坑_中空圆柱试件插件

插件介绍 CAD随机锈坑_中空圆柱试件插件可用于在AutoCAD软件内生成表面存在球形坑洞的中空圆柱体部件。插件在AutoCAD内生成的三维锈坑模型可导入COMSOL、Abaqus、ANSYS等有限元软件内进行仿真模拟,也可用于表面锈坑模型的科研绘图方面。 插件可控制中空圆柱体模…