C++拾趣——使用VSCode跨平台调试CMake编译的C/C++项目

news2024/11/26 9:38:01

大纲

  • 远程连接
  • 编译
  • 调试
    • 安装插件/组件
      • VSCode插件
      • 调试组件
    • 配置CMakePresets.json
    • 配置CMake Tools
    • 调试
  • 参考资料

VSCode的远程开发功能为开发者带来了诸多好处,极大地提升了开发效率和灵活性。首先,它允许开发者在本地编辑环境中直接连接到远程服务器或容器进行代码开发,这样就不需要在本地机器上搭建完整的开发环境,节省了大量的时间和精力。无论是使用SSH连接到远程Linux服务器,还是在Docker容器中进行开发,VSCode都提供了无缝的集成和便捷的操作体验。

远程开发的好处不仅在于节省时间,还在于它提供了跨平台的支持。开发者可以在任何操作系统上使用VSCode,并通过远程开发功能连接到远程服务器,这消除了对特定平台的依赖,使得开发环境更加灵活和多样化。同时,VSCode丰富的插件生态系统也为远程开发提供了强大的支持,无论是代码编辑、调试、版本控制还是其他开发工具,都可以通过安装相应的插件来实现。

远程连接

如果远程机器是WSL,可以参考《Windows Subsystem for Linux——vscode远程开发》这篇文章;如果是某些通过IP访问的机器,只要配置User/.ssh/config文件
在这里插入图片描述
在里面添加如下字段即可。
在这里插入图片描述
然后通过Connnect to Host,选择对应的机器,便可以登录进去。
在这里插入图片描述

编译

我们以调试《C++拾趣——编译器预处理宏__COUNTER__的应用场景》中的项目为例。它的路径位于https://github.com/f304646673/cpulsplus/tree/master/counter。其目录结构如下:

在这里插入图片描述
最外层的CMakeLists.txt定义了项目的根目录以及头文件路径,然后通过add_subdirectory处理子目录中的CMakeLists.txt。

cmake_minimum_required(VERSION 3.12)
project(counter)

# Set the root directory to the current directory
set(ROOT_DIR ${CMAKE_SOURCE_DIR})

include_directories(${CMAKE_SOURCE_DIR})

# 自定义函数:遍历所有子目录并添加包含CMakeLists.txt的子目录
function(add_all_subdirectories)
    file(GLOB_RECURSE SUBDIRS RELATIVE ${CMAKE_SOURCE_DIR} */CMakeLists.txt)
    foreach(SUBDIR ${SUBDIRS})
        get_filename_component(DIR ${SUBDIR} DIRECTORY)
        add_subdirectory(${DIR})
    endforeach()
endfunction()

# 调用自定义函数
add_all_subdirectories()

子目录的CMakeLists.txt如下。它会按最后一层目录生成一个可执行文件名,然后编译这个目录下的代码,最后链接相关库,生成可执行文件。

# Collect all source files in this directory
file(GLOB SOURCES "*.cpp")

# 获取当前文件所在目录名
get_filename_component(CURRENT_DIR ${CMAKE_CURRENT_SOURCE_DIR} NAME)

# 将目录名首字母大写
string(SUBSTRING ${CURRENT_DIR} 0 1 FIRST_CHAR)
string(TOUPPER ${FIRST_CHAR} FIRST_CHAR_UPPER)
string(SUBSTRING ${CURRENT_DIR} 1 -1 REMAINING_CHARS)
set(CAPITALIZED_DIR_NAME "${FIRST_CHAR_UPPER}${REMAINING_CHARS}")

# 拼接成add_executable的第一个参数
set(EXECUTABLE_NAME "${CAPITALIZED_DIR_NAME}Executable")

# Add the executable target
add_executable(${EXECUTABLE_NAME} ${SOURCES})

调试

为了让这个项目可以在VSCode中可以被调试,需要做如下准备工作。

安装插件/组件

VSCode插件

在VSCode的插件页面,我们在远程开发环境中安装CMake Tools和C/C++。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

调试组件

然后在远程环境(Linux)中安装必须的调试组件

sudo apt-get update
sudo apt-get install build-essential gdb

配置CMakePresets.json

CMakePresets.json 是一个用于配置 CMake 构建系统的 JSON 文件。它定义了不同的构建预设(presets),每个预设包含特定的构建配置和环境设置。以下是文件的主要部分和作用:

  • name: 预设的名称,用于在构建时选择特定的配置。
  • hidden: 一个布尔值,指示该预设是否在用户界面中隐藏。
  • description: 对预设的简短描述。
  • generator: 指定使用的构建系统生成器,例如 “Unix Makefiles”。
  • binaryDir: 指定构建输出的目录。
  • cacheVariables: 定义 CMake 缓存变量,例如 CMAKE_BUILD_TYPE。
  • environment: 设置构建时的环境变量,例如 CC 和 CXX。

内容如下:

{
    "version": 3,
    "cmakeMinimumRequired": {
        "major": 3,
        "minor": 10,
        "patch": 0
    },
    "configurePresets": [
        {
            "name": "Debug",
            "hidden": false,
            "description": "Debug build",
            "generator": "Unix Makefiles",
            "binaryDir": "${sourceDir}/build/log",
            "cacheVariables": {
                "CMAKE_BUILD_TYPE": "Debug",
                "CMAKE_EXPORT_COMPILE_COMMANDS": "YES"
            },
            "environment": {
                "CC": "gcc",
                "CXX": "g++"
            }
        },
        {
            "name": "Release",
            "hidden": false,
            "description": "Release build",
            "generator": "Unix Makefiles",
            "binaryDir": "${sourceDir}/build/log",
            "cacheVariables": {
                "CMAKE_BUILD_TYPE": "Release"
            },
            "environment": {
                "CC": "gcc",
                "CXX": "g++"
            }
        }
    ]
}

配置CMake Tools

在侧边栏我们打开CMake Tools
在这里插入图片描述
点击Configuration下的按钮,选择Debug
在这里插入图片描述
可以发现相关项目进行了编译链接。
在这里插入图片描述

调试

我们打开macro/main.cpp文件,然后在第7行下断点。
在这里插入图片描述
然后在侧边栏CMake Tools的PROJECT OUTLINE下找打上述文件对应的可执行文件,右键之,选择Debug。
在这里插入图片描述
如此我们就看到项目调试成功了。
在这里插入图片描述

参考资料

  • https://code.visualstudio.com/docs/cpp/cmake-linux

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

03 网络故障排查思路

一 排查思路 1 以业务流量路径为核心的故障排除思想 确认业务流量路径:在网络层和数据链路层中,需要根据报文转发过程确认业务流量的传输路径,以及数据帧在二层网络环境中是如何被交换机转发的。分层故障处理法:从OSI模型的底层…

【游戏行业秋招提前批最新动向应届生入职指南!】

游戏行业秋招提前批最新动向&应届生入职指南! 秋招非常非常重要!绝不能轻易错过!!! 早起的鸟儿有虫吃, 这句话对于企业和应届生双方而言都是适用的。 对于有校招需求的企业而言, 秋招是一年中规模最…

IDEA XML文件去掉黄色和绿色底色

XML映射文件去掉黄色背景:Settings ⇒ Editor ⇒ Inspections ⇒ SQL XML映射文件去掉绿色背景:Settings ⇒ Editor ⇒ Color Scheme ⇒ General ⇒ Code Java去掉重复代码提示:Settings ⇒ Editor ⇒ Inspections ⇒ General

页面设计任务 个人信息页面

目录 成品: 任务要求: 1. 创建一个基本的个人简介网页 2. 样式和布局要求 3. 详细样式要求 源码: 详细讲解: 1.导航栏部分: 2.头像和介绍部分: 3.技能列表部分 4.作品集部分 成品: 任务要求: 1. 创建一个基本…

B站宋红康JAVA基础视频教程个人笔记chapter07(面向对象高级)

文章目录 1.static关键字的学习1.1为什么需要static关键字1.2 static总结 2.单例设计模式3.静态代码块4.final关键字的使用5.抽象类和抽象方法5.1抽象类的由来 6.接口的使用6.1基本概念理解 7.匿名内部类的学习8.内部类9.枚举类9.包装类10.IDEA快捷键大全 1.static关键字的学习…

IOTE 2024 第二十二届国际物联网展 ·深圳站 8月28-30日唯创知音

​ 世界聚焦物联网,产业规模空前!一场高端产业研学盛会即将如约而至。 IOTE 2024 第二十二届国际物联网展深圳站,2024年8月28-30日将在深圳国际会展中心(宝安)开展,汇聚全球超800家参展企业、13万来自工业、物流、基础建设、智慧…

MySQL基本查询 -- 表的增删改查CRUD

CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除) 文章目录 1.Createa.insert语法:插入指定列:全列插入:一次插入多行数据: b. on duplicate key update ~ 插入否则更…

【前端】文件上传框架plupload使用(前后端交互)

这个框架是用来给前端设置文件上传的按钮的。 首先要明白,前端向后端发送请求的方式有get和post,两者的区别在于,前者只能在网址中携带参数,后者是在请求体body中携带参数。 Plupload向后端发送请求是post请求方式,发送…

Axios介绍;前后端分离开发的介绍;YAPI的使用;Vue项目简介、入门;Elementui的使用;nginx介绍

1 Ajax 1.1 Ajax介绍 1.1.1 Ajax概述 我们前端页面中的数据,如下图所示的表格中的学生信息,应该来自于后台,那么我们的后台和前端是互不影响的2个程序,那么我们前端应该如何从后台获取数据呢?因为是2个程序&#xf…

基于 Dots + GPU Instance 的大规模物体渲染

之前写的两篇开放世界技术栈都是公司其他同事做的,所以很多细节了解不详细。但这次是全程我自己搭建的轮子,可以讲得稍微详细些。 之前写的大规模物件渲染的 GPU 版本,虽然渲染量大效率高,但是有个很致命的缺陷:无法与…

Azure OpenAI citations with message correlation

题意:“Azure OpenAI 引用与消息关联” 问题背景: I am trying out Azure OpenAI with my own data. The data is uploaded to Azure Blob Storage and indexed for use with Azure AI search “我正在尝试使用自己的数据进行 Azure OpenAI。数据已上传…

行业应用 | 桥田MMC磁力换模系统-冲压场景案例分享

随着市场竞争的日益加剧,制造形态从单品种大批量转变为多品种小批量,品种的多样化对模具的多样化产生了需求,在更换产品品类时,首先需要更换加工模具。冲压是金属加工中的典型场景,如何缩短冲压模具的更换时间&#xf…

【Hot100】LeetCode—23. 合并 K 个升序链表

目录 1- 思路优先队列 2- 实现⭐23. 合并 K 个升序链表——题解思路 3- ACM 实现 原题连接:23. 合并 K 个升序链表 1- 思路 优先队列 1- 提供的数据结构:ListNode[] lists2- 由于提供的数据结构已经是有序的,不能通过指针实现是因为不知道一…

基于I2S和esp-now协议制作esp32对讲机

基于I2S和esp-now协议制作esp32对讲机 1.概述 这篇文章介绍基于I2S和esp-now协议制作对讲机,他的实现需要在ESP32开发环境的2.0.10版本号下才能成功,高版本号的源码有改动会导致编译失败。 安装ESP32 2.0.10版本: https://brucelong.blog.c…

2 nestjs 设计模式

回顾 MVC MVC(Model-View-Controller)设计模式是一种常用于软件开发的架构模式,旨在分离应用程序的不同部分,使得它们可以独立地开发、测试和维护。它将应用程序分为三个主要组件: Model(模型)…

什么牌子的开放式耳机性价比高?五款高口碑精品推荐!

由于传统入耳式耳机可能对耳道健康造成长期影响,许多人开始偏好选择开放式耳机的非侵入式设计。这种耳机有助于减少耳内湿润、细菌增长,以及耳道闷热的不适感。为了帮助大家在众多产品中挑选合适的开放式耳机,我将列举一些市场反馈良好的款式…

C#中的WebClient与XPath:实现精准高效的Screen Scraping

在现代互联网中,Screen Scraping(屏幕抓取)已成为从网页中提取信息的重要技术。对于C#开发者来说,WebClient和XPath是实现高效抓取的重要工具。本文将概述如何使用C#中的WebClient类结合XPath技术,实现精准高效的Scree…

探索科技潮流新领地厦门凯酷全科技有限公司抖音小店

在这个日新月异的数字时代,科技不仅深刻改变了我们的生活方式,更成为连接消费者与未来生活的桥梁。今天,就让我们一起走进厦门凯酷全科技有限公司的抖音小店,感受一场科技与时尚的完美碰撞,体验未来生活触手可及的魅力…

Python 和 PyCharm 安装(傻瓜式)

为什么要安装Python? 当我们写 python 代码的时候,需要有环境的支持,才可以运行代码。而 python 的安装支持了两个主要部分,分别是解释器和标准库。当我们安装完成,就可以使用python里面的标准库来写代码,而…

Linux 内核源码分析---netfilter 框架

iptables是用户用来管理和配置防火墙规则的一种策略,但是实际解析规则并按照规则实施产生作用的是Netfilter。 iptables 与协议栈内有包过滤功能的 hook 交互来完成工作,这些内核 hook 构成了 netfilter 框架。每个进入网络系统的包(接收和发…