当前位置: 首页 > news >正文

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

大纲

  • 远程连接
  • 编译
  • 调试
    • 安装插件/组件
      • 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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 微信小程序实例代码解读
  • 数据结构--图(笔记)
  • 滑块缺口研究实例(C#颜色滑块缺口计算)
  • 【STM32 Blue Pill编程】-读取数字引脚输入
  • 回顾前面刷过的算法(6)
  • web前端之vue+element+select实现多选、两个数组排序、保持源数据、查找索引、过滤、克隆、复制、findIndex、filter
  • ansible搭建+ansible常用模块
  • Python - sqlparse 解析库的基础使用
  • Spring Boot 集成 Elasticsearch 时,是使用 Java API 还是原生的 Elasticsearch API?
  • 2024 Testing Expo即将开幕,怿星科技展品大剧透!
  • .Net插件开发开源框架
  • Win 11用户全面中招,微软强制更新致性能下降45%
  • AtCoder Beginner Contest 367(ABCDEF题)视频讲解
  • 将iso格式的镜像文件转化成云平台能安装的镜像格式(raw/vhd/QCOW2/VMDK )亲测--图文详解
  • 优化Maven镜像配置:使用阿里云加速依赖下载
  • Google 是如何开发 Web 框架的
  • [Vue CLI 3] 配置解析之 css.extract
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • JWT究竟是什么呢?
  • leetcode386. Lexicographical Numbers
  • Linux gpio口使用方法
  • mysql innodb 索引使用指南
  • Mysql5.6主从复制
  • vue-cli在webpack的配置文件探究
  • 闭包,sync使用细节
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 聊聊flink的BlobWriter
  • 探索 JS 中的模块化
  • 网页视频流m3u8/ts视频下载
  • 硬币翻转问题,区间操作
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 终端用户监控:真实用户监控还是模拟监控?
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #QT项目实战(天气预报)
  • #控制台大学课堂点名问题_课堂随机点名
  • $refs 、$nextTic、动态组件、name的使用
  • %check_box% in rails :coditions={:has_many , :through}
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第1节 (全局数据、栈和堆)
  • (pycharm)安装python库函数Matplotlib步骤
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (回溯) LeetCode 40. 组合总和II
  • (十八)三元表达式和列表解析
  • (转)Mysql的优化设置
  • ***通过什么方式***网吧
  • .NET Core Web APi类库如何内嵌运行?
  • .NET 使用 XPath 来读写 XML 文件
  • .net 受管制代码
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • .net专家(张羿专栏)
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示