vscode多文件编译构建(CMake)和调试C++
目录
- 1. CMake 基础
- 构建工具及作用
- 相关配置文件
- 2. 配置 `tasks.json`
- 关键字段详细解释
- 3. 配置 `launch.json`
- 关键字段详细解释
- 4. 配置 `CMakeLists.txt`
- 关键部分详细解释
- 5. 构建和调试项目
- 1. 仅构建项目
- 1.1 任务执行顺序
- 1.2 `cmake` 任务执行详情
- 1.3 `build` 任务执行详情
- 1.4 构建后的 `build` 文件夹内容
- 2. 构建并调试:
项目结构如下图:
1. CMake 基础
CMake 是一个跨平台的构建系统生成器,能够生成各种构建工具的配置文件,如 Makefile、Ninja、Visual Studio 项目文件等。CMake 使用 CMakeLists.txt
文件来描述项目的构建过程。
构建工具及作用
-
Makefile: 由 GNU Make 使用,适用于类 Unix 系统(如 Linux 和 macOS)。它通过定义一系列规则和依赖关系,自动化编译和链接过程。因此在windows系统下使用需要下载
MinGW(Minimalist GNU for Windows)
或 MSYS2 等工具链,以获得 GNU Make 的功能。 -
Ninja: 一个专注于速度的小型构建系统,适用于大型项目。它比 Make 更高效,特别适合需要快速构建的场景。
-
Visual Studio 项目文件: 用于 Windows 平台,兼容 Microsoft Visual Studio 开发环境。它允许开发者在 Visual Studio 中管理和构建项目。
相关配置文件
-
CMakeLists.txt
: 主配置文件,位于项目根目录,定义了项目的构建配置、目标、依赖关系等。 -
build/
目录: 生成的构建文件存放的目录,通常由 CMake 自动生成和管理。 -
Makefile
或build.ninja
: 由 CMake 根据指定的生成器生成的构建配置文件,用于实际的编译和链接过程。
本文默认读者具备 CMake
, Make
以及 g++
相关命令和配置的基础知识。
2. 配置 tasks.json
tasks.json
文件用于定义 VS Code 中的自定义任务,这些任务可以在命令面板中运行。以下是一个典型的 tasks.json
配置示例:
{// tasks.json 版本号"version": "2.0.0","tasks": [{// 任务标签,用于在其他任务中引用"label": "build",// 任务类型:shell 表示在shell中执行命令"type": "shell",// 要执行的命令"command": "cmake --build \"${workspaceFolder}/build\"",// 任务组配置"group": {// 指定任务类型为构建"kind": "build",// 设置为默认构建任务"isDefault": true},// 指定此任务依赖的其他任务,这里依赖cmake任务"dependsOn": ["cmake"],// 用于在VSCode中识别编译错误的匹配器"problemMatcher": ["$gcc"]},{"label": "cmake","type": "shell",// 生成CMake构建文件,指定生成器为MinGW Makefiles"command": "cmake","args": ["-B","${workspaceFolder}/build","-G","MinGW Makefiles","-S","${workspaceFolder}"],// 任务的工作目录配置"options": {"cwd": "${workspaceFolder}"}}]
}
关键字段详细解释
-
label
: 任务的名称,用于在命令面板或其他任务中引用该任务。例如,可以在dependsOn
中引用此标签。 -
type
: 任务类型,决定了任务如何执行。-
shell
: 表示任务将在系统的默认 shell 中执行命令。适用于需要通过 shell 解释器运行的命令,如bash
,cmd
,PowerShell
等。 -
process
: 表示任务将直接启动一个独立的进程来执行命令,而不通过 shell。适用于需要直接调用可执行文件或脚本的情况。
-
-
command
: 要执行的主要命令。例如,cmake
、make
、g++
等。 -
args
: 传递给command
的参数列表。每个参数作为数组的一个元素。 -
group
: 任务组配置,用于组织任务。-
kind
: 任务类型,如build
、test
等。这有助于在 VS Code 中对任务进行分类和筛选。 -
isDefault
: 布尔值,指示该任务是否为默认任务。默认任务通常在按下Ctrl + Shift + B
时执行。
-
-
dependsOn
: 指定当前任务依赖的其他任务。只有在依赖的任务完成后,当前任务才会执行。例如,build
任务依赖于cmake
任务,确保先生成构建文件再进行编译。 -
problemMatcher
: 问题匹配器,用于捕获编译过程中产生的错误和警告信息。这些信息将在 VS Code 的“问题”面板中显示,便于调试。例如,$gcc
匹配器用于匹配 GCC 编译器的输出格式。
3. 配置 launch.json
launch.json
文件用于配置 VS Code 的调试设置。以下是一个典型的 launch.json
配置示例:
{// 使用 IntelliSense 了解相关属性。// 悬停以查看现有属性的描述。// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387"version": "0.2.0","configurations": [{// 配置名称,显示在调试配置下拉菜单中"name": "Debug ast",// 调试器类型:C++ (GDB, LLDB)"type": "cppdbg",// 请求类型:launch表示启动程序"request": "launch",// 要调试的可执行文件路径"program": "${workspaceFolder}/build/ast",// 传递给程序的命令行参数"args": [],// 是否在程序入口点暂停"stopAtEntry": false,// 程序的工作目录"cwd": "${workspaceFolder}",// 要传递给程序的环境变量"environment": [],// 是否使用外部控制台窗口"externalConsole": false,// 调试器模式:gdb"MIMode": "gdb",// GDB调试器的路径"miDebuggerPath": "D:/mingw64/bin/gdb.exe",// GDB调试器的设置命令"setupCommands": [{// 启用GDB的美化打印功能"description": "Enable pretty-printing for gdb","text": "-enable-pretty-printing","ignoreFailures": true}],// 启动调试前要执行的任务"preLaunchTask": "build"} ]
}
关键字段详细解释
-
name
: 调试配置的名称,将在调试面板中显示,方便用户选择和识别不同的调试配置。 -
type
: 调试类型,指定使用的调试器。cppdbg
: 表示使用 C++ 调试器(如 GDB 或 LLDB)。适用于调试 C++ 程序。
-
request
: 调试请求类型。launch
: 表示启动一个新的调试会话,加载并运行指定的程序。
-
program
: 要调试的可执行文件的路径。通常指向构建生成的二进制文件。 -
args
: 传递给程序的命令行参数。可以是一个字符串数组,每个元素作为参数传递给程序。 -
stopAtEntry
: 布尔值,指示调试器是否在程序入口点(如main
函数)暂停。这对于逐步调试程序非常有用。 -
cwd
: 程序的工作目录。程序运行时的当前工作目录,可以不同于项目的根目录。 -
environment
: 要传递给程序的环境变量列表。可以用于配置程序运行时的环境。 -
externalConsole
: 布尔值,指示是否使用外部控制台窗口运行程序。false
表示在 VS Code 的集成终端中运行。 -
MIMode
: 调试器模式,指定使用的调试器类型。gdb
: 表示使用 GNU Debugger (GDB)。
-
miDebuggerPath
: 调试器的可执行文件路径。指定 GDB 的具体路径,确保 VS Code 能找到并使用正确的调试器。 -
setupCommands
: 调试器的设置命令列表。用于配置调试器的行为,如启用美化打印功能。 -
preLaunchTask
: 在启动调试前要执行的任务名称。例如,build
任务会先编译项目,然后启动调试。
4. 配置 CMakeLists.txt
CMakeLists.txt
文件用于描述项目的构建配置。以下是一个完整的 CMakeLists.txt
示例,并对关键部分进行了详细解释:
cmake_minimum_required(VERSION 3.19)
project(pi)# 设置C++标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 设置编译器选项
if(MSVC)add_compile_options("/utf-8")
else()# 对于 MinGW 和其他非 MSVC 编译器,设置 UTF-8 编码选项add_compile_options(-finput-charset=UTF-8 -fexec-charset=UTF-8)
endif()# 添加调试标志
set(CMAKE_BUILD_TYPE Debug)
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g")# 添加头文件搜索路径
target_include_directories(ast PRIVATE${CMAKE_SOURCE_DIR}${CMAKE_SOURCE_DIR}/parser${CMAKE_SOURCE_DIR}/ast
)
include_directories(./ ./ast ./parser)file(GLOB_RECURSE SOURCE "ast/*.cpp" "parser/*.cpp")
add_executable(ast ${SOURCE} ast.cpp)
关键部分详细解释
-
cmake_minimum_required(VERSION 3.19)
: 指定所需的最低 CMake 版本,确保使用必要的功能和语法。 -
project(pi)
: 定义项目名称为pi
。项目名称可以在整个CMakeLists.txt
文件中引用。 -
set(CMAKE_CXX_STANDARD 11)
: 设置 C++ 标准为 C++11。 -
set(CMAKE_CXX_STANDARD_REQUIRED ON)
: 强制要求使用指定的 C++ 标准,否则 CMake 将报错。 -
编译器选项:
-
MSVC: 如果使用的是 Microsoft Visual C++ 编译器,添加
/utf-8
选项以启用 UTF-8 编码。 -
其他编译器: 对于 MinGW 等非 MSVC 编译器,添加
-finput-charset=UTF-8
和-fexec-charset=UTF-8
选项以支持 UTF-8 编码。
-
-
set(CMAKE_BUILD_TYPE Debug)
: 设置构建类型为调试模式,这会影响生成的二进制文件包含调试信息。 -
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g")
: 在调试模式下,添加-g
标志以生成调试信息,便于调试器使用。 -
头文件搜索路径:
-
target_include_directories(ast PRIVATE ...)
: 为特定目标ast
添加私有头文件搜索路径。 -
include_directories(...)
: 为所有目标添加全局头文件搜索路径。
-
-
源文件收集:
-
file(GLOB_RECURSE SOURCE "ast/*.cpp" "parser/*.cpp")
: 递归地收集ast
和parser
目录下的所有.cpp
文件。 -
add_executable(ast ${SOURCE} ast.cpp)
: 将收集到的源文件添加到可执行文件ast
中。
-
5. 构建和调试项目
1. 仅构建项目
在VS Code中,可通过快捷键 Ctrl + Shift + B
触发构建任务。此操作会按照预先配置的任务依赖关系自动执行构建流程,具体过程如下:
1.1 任务执行顺序
-
触发
preLaunchTask: "build"
任务:当执行构建操作时,首先会根据
launch.json
文件中的配置,触发preLaunchTask
为"build"
的任务。这一过程确保在进行实际构建之前,所有必要的准备工作都已就绪。 -
build
任务依赖cmake
任务:build
任务被配置为依赖于cmake
任务。这意味着在执行build
任务之前,CMake 需要先运行,以生成构建系统所需的配置文件(如 Makefile 或 Ninja 文件)。
1.2 cmake
任务执行详情
-
执行
cmake
任务:cmake
任务负责生成构建配置文件。它会根据项目根目录下的CMakeLists.txt
文件中的指令,生成适用于指定生成器(如 MinGW Makefiles)的构建文件。具体执行过程如下:
-
初始化 CMake 配置:
CMake 读取
CMakeLists.txt
文件,解析项目设置、目标、依赖关系等信息。 -
生成构建文件:
根据指定的生成器(如 MinGW Makefiles),CMake 在
build
目录下生成相应的构建配置文件(如Makefile
)。
-
1.3 build
任务执行详情
-
执行
build
任务:在
cmake
任务完成后,build
任务会调用生成的构建系统(如make
)来编译和链接项目源代码,生成最终的可执行文件。具体执行过程如下:
-
编译源文件:
使用编译器(如
g++
)将源代码文件(.cpp
)编译成对象文件(.o
或.obj
)。 -
链接对象文件:
将所有对象文件和必要的库文件链接在一起,生成最终的可执行文件(如
ast.exe
或ast
)。 -
生成构建产物:
在
build
目录下生成可执行文件、中间对象文件以及其他构建产物。
-
1.4 构建后的 build
文件夹内容
构建完成后,build
文件夹将包含以下主要文件和目录:
-
Makefile:
由 CMake 生成,用于 Make 工具的构建配置文件。它包含了编译和链接项目所需的所有指令。
-
编译生成的二进制文件:
- Windows:
ast.exe
- Linux/macOS:
ast
这是最终生成的可执行文件,可以直接运行以测试程序功能。
- Windows:
-
中间对象文件:
如
.o
(Linux/macOS)或.obj
(Windows)文件。这些文件是源代码编译后的中间产物,用于最终的链接阶段。
2. 构建并调试:
- 设置断点: 在代码编辑器中, 点击行号左侧以设置断点
- 点击右上角的调试按钮:
- 选择调试配置
在调试视图的顶部下拉菜单中,选择预先配置的调试配置"Debug ast"
(该名称是launch.json
文件中自定义的)。该配置在launch.json
文件中定义,指定了调试器类型、目标可执行文件、启动参数等。
之后会自动构建并执行代码到断点处进行调试
相关文章:

vscode多文件编译构建(CMake)和调试C++
目录 1. CMake 基础构建工具及作用相关配置文件 2. 配置 tasks.json关键字段详细解释 3. 配置 launch.json关键字段详细解释 4. 配置 CMakeLists.txt关键部分详细解释 5. 构建和调试项目1. 仅构建项目1.1 任务执行顺序1.2 cmake 任务执行详情1.3 build 任务执行详情1.4 构建后的…...
使用Docker 部署 LNMP+Redis 环境
使用Docker 部署 LNMPRedis 环境 Docker 简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互…...
文件上传漏洞学习笔记
一、漏洞概述 定义 文件上传漏洞指未对用户上传的文件进行充分安全校验,导致攻击者可上传恶意文件(如Webshell、木马),进而控制服务器或执行任意代码。 危害等级 ⚠️ 高危漏洞(通常CVSS评分7.0)ÿ…...
375_C++_cloud手机推送,添加人脸告警信息到任务队列中,UploadAlarmPush是典型的工厂模式应用,为什么使用工厂模式完成这部分代码
一:AlarmFaceInfo的应用 让我帮你解析这个lambda表达式的实现: // ...................... .h ...........................// struct RsMsgPushTask_S : public Task{AlarmType_E mainAlarmType;unsigned int subAlarmType;DateTime alarmTime...
Spring Boot 中的日志管理
一、日志框架选择 1. 主流框架对比 框架特点Spring Boot 默认支持Logback- 性能优异,Spring Boot 默认集成- 支持自动热更新配置文件✅ (默认)Log4j2- 异步日志性能更强- 支持插件扩展- 防范漏洞能力更好❌ (需手动配置)JUL (JDK自带)- 无需额外依赖- 功能简单&am…...

火绒终端安全管理系统V2.0网络防御功能介绍
火绒终端安全管理系统V2.0 【火绒企业版V2.0】网络防御功能包含网络入侵拦截、横向渗透防护、对外攻击检测、僵尸网络防护、Web服务保护、暴破攻击防护、远程登录防护、恶意网址拦截。火绒企业版V2.0的网络防御功能,多层次、多方位,守护用户终端安全。 …...

海康摄像头 + M7s(Monibuca) + FFmpeg + Python实现多个网络摄像头视频流推流
最近在研究流媒体服务器时,我注意到了一款开源软件——M7s。按照官网的指南部署完成后,我开始进行测试,发现单视频流推送非常顺利,没有任何问题。然而,当我尝试进行多视频流推送时,却发现网上的相关教程寥寥…...
抖音视频如何下载保存去水印
随着短视频平台的兴起,抖音作为国内最受欢迎的短视频平台之一,吸引了大量用户上传和观看各种创意视频。许多用户在浏览抖音视频时,往往会想要保存一些有趣或精彩的视频片段,但抖音视频通常会有水印,影响观看体验。为了…...

【鸿蒙开发】第三十九章 LazyForEach:数据懒加载
目录 1 背景 2 使用限制 键值生成规则 组件创建规则 首次渲染 非首次渲染 改变数据子属性 使用状态管理V2 拖拽排序 1 背景 LazyForEach从提供的数据源中按需迭代数据,并在每次迭代过程中创建相应的组件。当在滚动容器中使用了LazyForEach,框架…...

HTTP-
一.HTTP 1.什么是HTTP HTTP(超文本传输协议)是一种工作在应用层的协议.主要用于网站,就是浏览器和服务器之间的数据传输. 小知识:什么是超文本传输协议 文本:是字符串.(能在utf8/gbk码表上找到合法字符) 超文本:不仅可以传输字符串,也可以传输图片,html等 富文本:word文档 2.HT…...
创建型模式 - 原型模式 (Prototype Pattern)
创建型模式 -原型模式 (Prototype Pattern) 它允许通过复制现有对象来创建新对象,而无需知道对象的具体创建细节。在 Java 中,可以通过实现 Cloneable 接口和重写 clone() 方法来实现原型模式。 有深、浅两种克隆 类实现 Cloneable 接口就可以深克隆如果…...
Android 8.0 (API 26) 对广播机制做了哪些变化
大部分隐式广播无法通过静态注册接收,除了以下白名单广播: ACTION_BOOT_COMPLETED ACTION_TIMEZONE_CHANGED ACTION_LOCALE_CHANGED ACTION_MY_PACKAGE_REPLACED ACTION_PACKAGE_ADDED ACTION_PACKAGE_REMOVED 需要以动态注册方案替换: cl…...

Unity汽车笔记
汽车的移动和转向 我们知道,汽车的前进后退是变速运动。按w,汽车开始加速,到最大速度后保持匀速,松开w,汽车受到阻力加速。如果按s减速,则以更大的加速度减速。后退反之。 按A/D时前轮偏转。只有前进后退…...
html中rel、href、src、url的区别
1.url url(统一资源定位符):是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。 2.href href:Hypertext Reference的缩写。 意思是超文本引用。 3.rel rel:relatio…...
【idea问题排查技巧】
以下是针对 IDEA 中 日志打标(动态标记) 和 全链路追踪 功能的分步详解,结合具体场景和操作截图说明,帮助快速掌握实战技巧。 一、动态日志打标:不修改代码输出关键信息 1. 断点日志打印(非侵入式打标) 场景:在调试时,需要临时查看某个变量的值,但不想修改代码添加…...

SQL: DDL,DML,DCL,DTL,TCL,
Structured Query Language,结构化查询语言, 是一种用于管理和操作关系数据库的标准编程语言。 sql的分类 DQL(Data Query Language):数据查询语言 DDL(Data Definition Language):数据定义语…...
WordPress R+L Carrier Edition sql注入漏洞复现(CVE-2024-13481)(附脚本)
免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x0…...
DeepSeek基础之机器学习
文章目录 一、核心概念总结(一)机器学习基本定义(二)基本术语(三)假设空间(四)归纳偏好(五)“没有免费的午餐”定理(NFL 定理) 二、重…...

QSplashScreen --软件启动前的交互
目录 QSplashScreen 类介绍 使用方式 项目中使用 THPrinterSplashScreen头文件 THPrinterSplashScreen实现代码 使用代码 使用效果 QSplashScreen 类介绍 QSplashScreen 是 Qt 中的一个类,用于显示启动画面。它通常在应用程序启动时显示,以向用户显…...
Python 循环嵌套
Python 循环嵌套 引言 在编程语言中,循环嵌套是一种常见且强大的编程技术。它允许开发者重复执行一段代码块,并在每个循环迭代中执行另一个循环。在Python中,循环嵌套广泛应用于数据分析和算法实现等领域。本文将详细介绍Python循环嵌套的概念、语法以及应用场景。 循环嵌…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10pip3.10) 一:前言二:安装编译依赖二:安装Python3.10三:安装PIP3.10四:安装Paddlepaddle基础框架4.1…...