Ubuntu上vscode调试C/C++代码

2023-11-05

这篇文章起初是我看了一个B站的视频,作者讲述了如何在Ubuntu的 环境中通过使用vscode调试C/C++代码。
这个教程非常好,也非常推荐给大家,但是这个教程有一个局限性,就是他在他的公共号上写的教程非常简略,以至于我想再次看一遍,需要重新看一遍视频,非常低效,所以我打算根据这位大佬的视频教程,写一篇博客,这样方便自己,也方便大家。
当然大家在网上也会搜到和我标题差不多的教程,但是我都看了一遍,都挺狗的,写的非常简略,你按照他们的教程基本就学的一个寂寞。

不过这里面也有挺多坑的,一般不自己梳理一遍很容易出现问题。里面需要书写cmake的文件

在这次教程中,我也会写一下,一个简单的C++项目,通过这个项目,大体梳理一下,整个调试的流程.

插件安装

进行C、C++项目的编译和调试。vscode上的插件必不可少。
在这里插入图片描述
目前,我用到的是,上面的这些。

简单的C++项目

首先看截图,
在这里插入图片描述
主要的文件结构也比较简单,主要就是include,src,CmakeLists.txt。
CmakeLists.txt主要功能就是通过cmake这个工具,将整个项目进行编译,然后方便我们后续的调试

CmakeLists.txt 文件书写

CmakeLists.txt里面的内容是

cmake_minimum_required(VERSION 3.0)

project(SOLIDERFIRE)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")

set(CMAKE_BUILD_TYPE Debug)

include_directories(${CMAKE_SOURCE_DIR}/include)

add_executable(my_cmake_exe main.cpp src/Gun.cpp src/Solider.cpp)

上面的内容简单直白。

  • my_cmake_exe编译成功产生的可执行文件的名字。
  • C M A K E S O U R C E D I R 是 C m a k e L i s t s . t x t 位 于 的 绝 对 路 径 除 此 之 外 , 我 们 还 可 以 给 这 个 文 件 加 入 其 他 的 优 化 选 项 , 以 及 配 置 参 数 一 般 的 就 是 ‘ s e t ( C M A K E C X X F L A G S , " {CMAKE_SOURCE_DIR} 是CmakeLists.txt 位于的绝对路径 除此之外,我们还可以给这个文件加入其他的优化选项,以及配置参数 一般的就是 `set(CMAKE_CXX_FLAGS, " CMAKESOURCEDIRCmakeLists.txtset(CMAKECXXFLAGS,"{CMAKE_CXX_FLAGS} -g -O2 -Wall")进行代码的优化,具体的当然也可以自行谷歌。(但是这种带优化的的编译选项会有一个问题,就是无法很好的调试) 在CmakeLists.txt中写入新的参数之后,需要重新执行cmake … 以及make`对项目进行编译。

set(CMAKE_BUILD_TYPE Debug) 这个参数非常重要,表示整个项目是支持debug调试的。

注意,每次CmakeLists.txt文件更新之后,需要执行一下 make进行重新的编译。

cmake 编译 以及 make生成可执行文件

cmake 编译

然后我们新建一个文件夹build,然后在命令行中进入build文件夹,执行 cmake ..
这样新生成的文件都会放在build文件夹之下了。
在这里插入图片描述

执行完cmake ..命令之后的文件目录:
在这里插入图片描述
可以看到生成了Makefile文件。这就是我们想要的。

make生成可执行文件

然后继续在build文件夹之下执行,make命令
在这里插入图片描述
可以看到这样,我们就生成了可执行程序my_cmake_exe
再看一下我们的文件目录:
在这里插入图片描述
然后需要注意的是,当你下次修改了项目中的某个文件之后,还需要执行make重新进行编译,同时这个命令也只会编译其中被修改过的文件,其他文件不会被编译。

launch.json文件书写

前面的两个小的章节是对整个项目进行编译,然后产生可执行程序,然后运行整个项目的结果。
在这里插入图片描述
点击左边栏目上,虫子和三角的符号就会出来这个界面,然后点击create a lauch.json按钮。
就会出来lauch.json这个文件,对这个文件进行编辑。

在这里插入图片描述
然后我们需要对两个最重要的参数进行编辑:

  • "program": "${workspaceFolder}/build/my_cmake_exe",
  • "preLaunchTask": "C/C++: g++ build active file",

第一个参数就是说,我通过cmake生成的可执行文件的位置,${workspaceFolder}代表整个项目的绝对路径。

在这里插入图片描述

task.json文件书写

lauch.json中设置的"preLaunchTask": "C/C++: g++ build active file",就是为task.json服务的。

我们在菜单栏中依次选择terminal-> Configure Default Build task
设置task.json文件。

然后就有朋友问了,这个突如其来的task.json文件是干嘛的呢?

其实这个文件是将我们之前的两个操作(cmake .. 以及 make)自动化实现起来的。
其中下面的截图中:

  • label:代表任务名
  • command:代表我们执行的命令
  • args: 代表执行命令跟的参数。

在这里插入图片描述
tasks下面有三个大括号,两个是 我们自定义的任务,还有一个是将这两个任务串联起来的命令,还有一个是开头的cwd命令,是指我们进行下面这些脚本操作的文件路径的位置。

好了,现在大家还记得我们在launch.json里面的"preLaunchTask": "C/C++: g++ build active file"参数吗?
这个参数意思就是,我们在执行lauch.json之前需要执行的操作是什么。

我现在将之修改为"preLaunchTask": "Build. 这个Build的来源是task.json中第三个大括号的label名。

  {
          "label": "Build",
    "dependsOrder": "sequence", // 按列出的顺序执行任务依赖项
          "dependsOn":[
              "cmake",
              "make"
          ]
      }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ubuntu上vscode调试C/C++代码 的相关文章

  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • 函数参数的默认参数是否被视为该参数的初始值设定项?

    假设我有这样的函数声明 static const int R 0 static const int I 0 void f const int r R void g int i I 根据 dcl fct default 1 如果在参数声明中指
  • 为什么在 WebApi 上下文中在 using 块中使用 HttpClient 是错误的?

    那么 问题是为什么在 using 块中使用 HttpClient 是错误的 但在 WebApi 上下文中呢 我一直在读这篇文章不要阻止异步代码 https blog stephencleary com 2012 07 dont block
  • 对 std::vector 进行排序但忽略某个数字

    我有一个std vector
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 打破 ReadFile() 阻塞 - 命名管道 (Windows API)

    为了简化 这是一种命名管道服务器正在等待命名管道客户端写入管道的情况 使用 WriteFile 阻塞的 Windows API 是 ReadFile 服务器已创建启用阻塞的同步管道 无重叠 I O 客户端已连接 现在服务器正在等待一些数据
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 在 NaN 情况下 to_string() 可以返回什么

    我使用 VS 2012 遇到了非常令人恼火的行为 有时我的浮点数是 NaN auto dbgHelp std to string myFloat dbgHelp最终包含5008角色 你不能发明这个东西 其中大部分为0 最终结果是 0 INF
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • WPF DataGridTemplateColumn 组合框更新所有行

    我有这个 XAML 它从 ItemSource 是枚举的组合框中选择一个值 我使用的教程是 http www c sharpcorner com uploadfile dpatra combobox in datagrid in wpf h
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 可访问性不一致:参数类型的可访问性低于方法

    我试图在两个表单之间传递一个对象 基本上是对当前登录用户的引用 目前 我在登录表单中有一些类似的内容 private ACTInterface oActInterface public void button1 Click object s
  • 使用 omp_set_num_threads() 将线程数设置为 2,但 omp_get_num_threads() 返回 1

    我有以下使用 OpenMP 的 C C 代码 int nProcessors omp get max threads if argv 4 NULL printf argv 4 s n argv 4 nProcessors atoi argv
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File
  • 如何将十六进制字符串转换为无符号长整型?

    我有以下十六进制值 CString str str T FFF000 如何将其转换为unsigned long 您可以使用strtol作用于常规 C 字符串的函数 它使用指定的基数将字符串转换为 long long l strtol str

随机推荐

  • avalon ms-repeat avalon1

    工作原因要用到avalon二次开发 但是看了下以前的avalon版本是1 现在大多数都是2版本了吧 所以很多文档不好找 但是大多数还是好用的 ms repeat 循环当前赋值的 ms repeat 加载需要循环显示的子元素上 默认el ms
  • ftp工具无法连接到Linux服务器

    ftp工具无法连接Linux服务器 文件无法上传 是因为你的ftp服务器未搭建 或未启动 许久没有登录腾讯云 今天想用xshell的xftp工具上传文件 却突然出现连接不上 用22端口 可以正常登录并访问 但是ftp工具的21端口无法连上远
  • 万字长文解读计算机视觉中的注意力机制(附论文和代码链接)

    文中论文和代码已经整理 如果需要 点击下方公号关注 领取 持续传达瓜货 所向披靡的张大刀 注意力机制是机器学习中嵌入的一个网络结构 主要用来学习输入数据对输出数据贡献 注意力机制在NLP和CV中均有使用 本文从注意力机制的起源和演进开始 并
  • centos登录root账户

    su root 然后输入密码 回车
  • Element 入门教程

    Element 入门 Element 布局 业务 element 美化页面 表格 表单 对话框 表单 分页工具条 页面 Element 入门 官网 https element eleme cn zh CN 引入 Element 的 css
  • scala学习-scala读取Hbase表中数据并且做join连接查询

    1 业务需求 sparkSQL on hbase sparkSQL直接读取Hbase中的两个表 进行连接查询 2 图示 绿色的线 上图中绿色的线是做过测试的 直接在hive中建表 然后load数据进去 数据文件是存储在HDFS上的 1 建表
  • 【React】setState是同步的还是异步的?

    文章目录 异步情况下的setState 控制setState的同步和异步 setState 同步 异步总结 setState 的参数接收 异步情况下的setState import React Compontent from react c
  • Spring报错 conflicts with existing, non-compatible bean definition of same name and class

    如果出现这个错误可能有两种情况 1 那就是你的spring容器中确实注入了两个同名的对象 这个需要仔细检查自己的 Service Controller component是不是有相同的value值 或者xml文件中有两个一样的id 2 就是
  • 运行Adobe提示This non-genuine Adobe app has been disabled soon

    运行Adobe提示This non genuine Adobe app has been disabled soon这个问题 如何解决呢 小编为大家带来了详细的解决方案 一起来看看吧 分享一个临时处理可用的方法 需要用到的软件 Radio
  • 桌面下雪小程序 WIN32

    想起以前还没有上大学的时候 过圣诞节 有同学发了一个桌面下雪的小程序 当看到效果的 哇 当时觉得好高端 就想什么时候我也能写出这么一个程序 学了计算机之后 发现这完全可以实现 于是就准备写一个 当卡壳的时候在网上找资料 结果发现在网上找到的
  • HashMap为什么使用红黑树而不用普通的AVL树

    红黑树是一种平衡二叉树 要求从根到叶子的最长路径不会超过最短路径的2倍 AVL树是高度平衡的二叉树 左右子树树高不超过1 补充 AVL是Adelson Velskii和Landis树的缩写 是一种用于排序的二叉搜索树 一般用平衡因子判断是否
  • 操作生产库之前--你应该做什么

    操作生产库之前 你应该做什么 操作之前的数据库风险单 在操作生产库一般可能会出现无法预知的未知因素 这可能给数据库的操作带来意外的麻烦 这些都是在操作之前 应该考虑的 数据库操作者 操作开始时间 操作时间范围 预计工作时间的两倍半 可能出现
  • 为什么程序员一定要会用Google和Stack Overflow?

    内容简介 前言 为什么用Google不用百度 为什么用Stack Overflow 小结 前言 下文中 谷歌统一用Google表示 作为程序员 用Google比用百度更节省时间 此话不假 在法国工作也有4年了 加上之前的两个6个月的实习 勉
  • angularjs中post请求进行跨域

    post请求进行跨域 angularjs内置封装了类ajax的网络服务 http 所以实现了依赖外部插件来完成完整的前后端分离方案 scope main getData function http method POST url http
  • Git基于已有分支创建新的分支,简单的git 命令

    准备工作 进入要创建git分支项目目录 打开git命令行 1 基于已有分支代码创建新的分支 git checkout b new branch name origin source branch 2 将代码推送到新创建的git分支上 git
  • Qt Creator使用内存泄漏检测工具Valgrind

    Qt Creator使用内存泄漏检测工具Valgrind 随着软件变得越来越复杂 内存泄漏和野指针问题已经成为程序员最头痛的问题之一 幸运的是 现代IDE提供了许多工具来帮助我们解决这些问题 在这篇文章中 我们将介绍如何在Qt Creato
  • 单价数量和总价的公式_小学六年超全的数学公式!家长们赶紧给孩子看过来……...

    小学数学基础知识整理 一到六年级 小学一年级 初步认识加减法 学会基础加减 小学二年级 完善加减法 表内乘法 学会应用题 基础几何图形 小学三年级 学会万以内加减法 长度单位和质量单位 倍数的认知 多位数乘一位数 时间量及单位 长方形和正方
  • 租赁OLED透明屏:打造独特商业体验的智慧选择

    近年来 OLED透明屏技术在商业领域中迅速崛起 其高透明度和卓越的图像质量为商家创造了全新的展示方式 租赁OLED透明屏作为一种智慧选择 不仅能提升品牌形象和吸引力 还能创造与众不同的视觉体验 对此 尼伽将和大家一起深入探讨租赁OLED透明
  • 如何从零开始搭建公司自动化测试框架?

    搭建的自动化测试框架要包括API测试 UI测试 APP测试三类 以上三类其实可以简化为两类 那就是 1 接口自动化测试框架搭建 2 UI自动化测试框架搭建 没问题 安排 且是手把手教你如何搭建以上两类自动化测试框架 刷到这个问题的测试人员
  • Ubuntu上vscode调试C/C++代码

    这篇文章起初是我看了一个B站的视频 作者讲述了如何在Ubuntu的 环境中通过使用vscode调试C C 代码 这个教程非常好 也非常推荐给大家 但是这个教程有一个局限性 就是他在他的公共号上写的教程非常简略 以至于我想再次看一遍 需要重新