vscode调试C++ 以及 cMake编写

2023-05-16

vscode对C++程序进行调试
cMake

简单的CMakeLists

1.先编写hello.cpp

# include <iostream>

int main(int argc, char* argv[]){
    
    for(int i = 0 ; i < argc ; i++){
        std::cout << argv[i] << std::endl;
    }

    std::cout << "hello" << std::endl;
    return 0;
}

然后写 CMakeLists

# 需要的cMake最低版本
cmake_minimum_required(VERSION 3.2) 
# 项目信息
project(hello) 

# 一定要set这句才能debug模式
set(CMAKE_BUILD_TYPE "Debug") # CMAKE_BUILD_TYPE 一定要大写
# set(CMAKE_CXX_FLAGS "-O3")
# set(CMAKE_BUILD_TYPE DEBUG) 

add_executable(hello hello.cpp) # 可执行文件名 源文件名.cpp

2.然后建立build目录,进,然后执行

cmake ..
make

简单的模板

# CMake最低版本要求
cmake_minimum_required(VERSION 2.8)
 
# 项目信息
project(AdaptiveMedianFilter) # ${PROJECT_NAME}
 
# 查找包, opencv使用
find_package(OpenCV REQUIRED)
 
# 添加头文件路径
include_directories(${CMAKE_CURRENT_LIST_DIR}/inc)
 
# 添加源文件路径,并将其保存在变量source_path中
aux_source_directory(${CMAKE_CURRENT_LIST_DIR}/src source_path)
 
# 指定生成目标,引用source_path变量
add_executable(${PROJECT_NAME} ${source_path})
 
# 显式指定编译器
set(CMAKE_CXX_COMPILER "g++")
 
# 开启调试信息
# 以下三行都需要有???
set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
 
# 开启所有警告
set(CMAKE_CXX_FLAGS "-Wall")
 
# 目标链接库, opencv使用, 表示当前目标文件需要链接库:${OpenCV_LIBS}
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})
 

注意:“开启调试信息”那里的三行代码必须要有,否则无法对生成的目标文件进行调试。由于我的小项目中使用到了opencv,因此加了”查找包“和“目标链接库”两行代码,若无需要可不加。其他代码可以根据需要自行添加。

3.此时生成了hello程序,可以开始调试

  • 先点击vscode的运行->启动调试,会生成调试需要的 launch.json 文件
  • 然后修改 program 为你要调试的程序
  • 然后 启动调试 即可
{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
    	// 可以在这里列表里面添加多个对象来调试多个程序
        {
            "name": "(gdb) 启动",
            "type": "cppdbg",
            "request": "launch",
            // program字段告诉 vscode 应该调试哪一个程序
            "program": "${workspaceFolder}/build/hello", // 工程所在目录下/build/可执行文件名
            "args": ["中国 ", " 是一个伟大的国家"], // 用于设置程序的传入参数
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

4.以上在调试前先用cmake进行编译,然后再调试,很麻烦,可以加一个任务让调试前先自动生成可执行程序

  • launch.json 中加入 "preLaunchTask": "build"
  • 然后创建 tasks.json ,创建方法鼠标在vs界面中 右键–> 命令面板–> 选择tasks (输入tasks 然后找自己要的 配置生成 的那个),会自动生成模板
  • 修改内容, 其中 label 的值一定要和 launch中的 preLaunchTask的值一样
  • 修改 “command” 用于在调试之前先生成代码
  • 之后点击调试就可以自动进行调试了
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
        	// 其中 label 的值一定要和 launch中的 preLaunchTask的值一样
            "label": "build",
            "type": "shell", // 这里要是 shell 才能执行command里面的命令,但是报错了
            "command": "mkdir build;cd build;cmake ..;make",
            "group": "build",
            "presentation": {
                // Reveal the output only if unrecognized errors occur.
                "reveal": "silent"
            },
            // Use the standard MS compiler pattern to detect errors, warnings and infos
            "problemMatcher": "$msCompile"
        }
    ]
}

5.按照以上步骤未成功
在VScode中使用cmake + make 方式调试C++代码时,想要正常进行断点调试,在CMakeLists.txt文件中需要注意以下两点:

  • 设置为"Debug"模式:set(CMAKE_BUILD_TYPE “Debug”),如果设置为"Release"模式,设置断点后在调试时是默认无效的,进入调试后,断点会变为空心断点,程序不会在任何断点处停下。
  • 取消代码编译优化:一定要注释掉set(CMAKE_CXX_FLAGS “-O3”)(或不写),否则“任何级别的优化都将带来代码结构的改变,将会使目标代码的执行顺序变得面目全非,导致调试信息严重不足。”

然后参考

1.修改 launch.json 文件
在这里插入图片描述

2.vscode make : 无法将“make”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
在这里插入图片描述

在这里插入图片描述
3.cmake .. 编译报错
在这里插入图片描述
在这里插入图片描述
以上都还没有解决我的问题
有可能是 MinGW 版本的问题,重新装试一下
ps win环境开发太折磨人了

最后突然就调试成功了
1.删除.vscode文件夹
2.运行->启动调试
3.按提示选择 g++
4.重新装插件,然后就好了
贼离谱

参考

1.vscode对C++程序进行调试
2.解决在VScode中调试C++代码断点无效、断点错位的问题
3.Linux下使用VS Code + CMake 调试c++程序
4.VS Code之C/C++程序的调试(Debug)功能简介

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vscode调试C++ 以及 cMake编写 的相关文章

随机推荐

  • MATLAB画图调整分辨率

    问题 xff1a 经常需要用MATLAB画图 xff0c 但是保存之后分辨率不高 xff0c 特别是需要放大的情况下 解决 xff1a 对于下面这种画出的图形 选择 文件 61 gt 导出设置 61 gt 渲染 61 gt 分辨率 选择60
  • C语言中常见的逻辑错误

    常见错误一 xff1a 61 和 61 61 混在一起 int main int ret if ret 61 1 return 0 结果 xff1a 变量被错误赋值 xff0c 逻辑判断错误 错误二 xff1a 定义较大的全局变量造成 编译
  • Qt中常见的位置和尺寸

    QPoint类的介绍 QPoint 类封装了我们常用用到的坐标点 x y 常用的 API 如下 构造函数 构造一个坐标原点 即 0 0 QPoint QPoint 参数为 x轴坐标 y轴坐标 QPoint QPoint int xpos i
  • 关于QT线程运用的三种方式

    QThread 类函数 QThread 类常用 API 构造函数 QThread QThread QObject parent 61 Q NULLPTR 判断线程中的任务是不是处理完毕了 bool QThread isFinished co
  • 安装Ubuntu22.04+nvidia驱动+CUDA-11.7+GRPMACS patch PLUMED

    首先是Ubuntu22 4的安装 Ubuntu系统一般直接可以使用RUFUS软件制作U盘启动项 xff0c 再依照顺序安装Ubuntu系统 xff0c 这里不赘述 CUDA 11 7 span class token function su
  • Linux部署Nexus私服

    这篇文章主要介绍了Linux搭建自己Nexus私服的实现方法 xff0c 文中通过示例代码介绍的非常详细 xff0c 对大家的学习或者工作具有一定的参考学习价值 一 Nexus介绍 对maven来说仓库分为两类 xff1a 本地仓库和远程仓
  • 元学习和机器学习的对比

    目录 引言机器学习元学习什么是元学习元学习的流程学习学习函数评价学习函数好坏迭代优化 整体框架 元学习和机器学习的对比定义的区别数据集划分的区别损失函数的区别两者之间的共通之处 总结 引言 本篇博客是李宏毅老师元学习课程的笔记 深度学习大部
  • 如何使用C++实现10个数的冒泡排序

    96 96 冒泡排序是一种计算机科学领域的较简单的排序算法 xff0c 是一种简单的适合初学者学习的算法 上图为冒泡排序简单的图片理解 xff0c 将第一个数依次与后面的数进行比较 将数值大的数沉到底部或将数值小的数浮到顶部 简称 大数沉淀
  • 通过Cerebro访问Elasticsearch

    本文以阿里云Elasticsearch为例 xff0c 介绍通过Cerebro访问Elasticsearch的方法 阿里云Elasticsearch兼容开源Elasticsearch的功能 xff0c 以及Security Machine
  • 手把手教您完成Elasticsearch数据迁移

    您可以通过Logstash reindex和OSS等多种方式在Elasticsearch之间迁移数据 本文以阿里云Elasticsearch xff08 简称ES xff09 为例 xff0c 介绍阿里云Elasticsearch间数据迁移
  • Solr集群数据迁移至Elasticsearch

    Elasticsearch是一款非常强大的搜索引擎 xff0c 可以让你在海量的数据中快速找到想要的内容 例如 xff0c 代码搜索 xff1a 可以帮助您找到相应的代码仓库 xff0c 还可以实现代码级的搜索及高亮显示 xff1b 网上s
  • k8s创建Deployment报错:no matches for kind “Deployment“ in version “extensions/v1beta1“

    报错类型 xff1a root 64 master kubectl create f lzb test yaml error unable to recognize 34 lzb test yaml 34 no matches for ki
  • 3分钟学会使用Elasticsearch跨集群复制功能(CCR)

    当您需要将本地Elasticsearch集群中的索引数据迁移到一个远程集群中 xff0c 或者将一个远程集群中的索引数据迁移到本地集群 xff0c 可通过跨集群复制CCR xff08 Cross Cluster Replication xf
  • 通过Elasticsearch和rsbeat实时分析Redis slowlog

    Redis是目前流行的高性能key value数据库 xff0c 但如果使用不当 xff0c 很容易出现慢查询 慢查询过多或者一个时间较长 xff08 例如20s xff09 的慢查询会导致操作队列 xff08 Redis是单进程 xff0
  • 通过Monstache实时同步MongoDB数据到Elasticsearch

    当您的业务数据存储在MongoDB中 xff0c 并且需要进行语义分析和大图展示时 xff0c 可借助Elasticsearch实现全文搜索 语义分析 可视化展示等 本文介绍如何通过Monstache将MongoDB数据实时同步至Elast
  • 【必入】云虚拟主机怎么屏蔽指定的IP地址

    解决方法 可通过下面2种方法屏蔽指定的IP地址 xff0c 具体操作步骤请点击此链接 xff1a https help aliyun com knowledge detail 36226 html 通过 htaccess文件屏蔽指定的IP地
  • 通过ES-Hadoop实现Spark读写Elasticsearch数据

    ES Hadoop是Elasticsearch推出的专门用于对接Hadoop生态的工具 xff0c 可以让数据在Elasticsearch和Hadoop之间双向移动 xff0c 无缝衔接Elasticsearch与Hadoop服务 xff0
  • 通过Uptime实时监控云Elasticsearch服务

    Heartbeat支持通过HTTP HTTPS TCP和ICMP服务 xff0c 定期检测网络端点状态 xff0c 并将采集的检测数据 xff0c 输出到Kibana的Uptime应用中 xff0c 实时监控应用程序及服务的可用性和响应时间
  • 网站URL路径中“#”“?”“&”号的作用是什么

    虽然在搜索引擎蜘蛛抓取的过程中 xff0c 对于网站URL路径中出现的 xff1f amp 等符号 xff0c 会严重影响蜘蛛的抓取 可是在网站URL结构当中的动态路径中 xff0c xff1f amp 也是经常出现的特殊符号 xff0c
  • vscode调试C++ 以及 cMake编写

    vscode对C 43 43 程序进行调试 cMake 简单的CMakeLists 1 先编写hello cpp span class token macro property span class token directive hash