vscode多文件编译构建(CMake)和调试C++

ops/2025/2/27 7:42:20/

目录

    • 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. 构建并调试:

项目结构如下图:
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/9061fa11ab08459fa3f20fd57c1c1dab.p

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 自动生成和管理。

  • Makefilebuild.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: 要执行的主要命令。例如,cmakemakeg++ 等。

  • args: 传递给 command 的参数列表。每个参数作为数组的一个元素。

  • group: 任务组配置,用于组织任务。

    • kind: 任务类型,如 buildtest 等。这有助于在 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"): 递归地收集 astparser 目录下的所有 .cpp 文件。

    • add_executable(ast ${SOURCE} ast.cpp): 将收集到的源文件添加到可执行文件 ast 中。

5. 构建和调试项目

1. 仅构建项目

在VS Code中,可通过快捷键 Ctrl + Shift + B 触发构建任务。此操作会按照预先配置的任务依赖关系自动执行构建流程,具体过程如下:

1.1 任务执行顺序
  • 触发 preLaunchTask: "build" 任务

    当执行构建操作时,首先会根据 launch.json 文件中的配置,触发 preLaunchTask"build" 的任务。这一过程确保在进行实际构建之前,所有必要的准备工作都已就绪。

    preLaunchTask "build" 触发

  • build 任务依赖 cmake 任务

    build 任务被配置为依赖于 cmake 任务。这意味着在执行 build 任务之前,CMake 需要先运行,以生成构建系统所需的配置文件(如 Makefile 或 Ninja 文件)。

    build 任务依赖 cmake 任务

1.2 cmake 任务执行详情
  • 执行 cmake 任务

    cmake 任务负责生成构建配置文件。它会根据项目根目录下的 CMakeLists.txt 文件中的指令,生成适用于指定生成器(如 MinGW Makefiles)的构建文件。

    执行 cmake 任务

    具体执行过程如下:

    1. 初始化 CMake 配置

      CMake 读取 CMakeLists.txt 文件,解析项目设置、目标、依赖关系等信息。

    2. 生成构建文件

      根据指定的生成器(如 MinGW Makefiles),CMake 在 build 目录下生成相应的构建配置文件(如 Makefile)。

    cmake 任务执行过程

1.3 build 任务执行详情
  • 执行 build 任务

    cmake 任务完成后,build 任务会调用生成的构建系统(如 make)来编译和链接项目源代码,生成最终的可执行文件。

    执行 build 任务

    具体执行过程如下:

    1. 编译源文件

      使用编译器(如 g++)将源代码文件(.cpp)编译成对象文件(.o.obj)。

    2. 链接对象文件

      将所有对象文件和必要的库文件链接在一起,生成最终的可执行文件(如 ast.exeast)。

    3. 生成构建产物

      build 目录下生成可执行文件、中间对象文件以及其他构建产物。

    build 后的 build 文件夹内容

1.4 构建后的 build 文件夹内容

构建完成后,build 文件夹将包含以下主要文件和目录:

  • Makefile

    由 CMake 生成,用于 Make 工具的构建配置文件。它包含了编译和链接项目所需的所有指令。

  • 编译生成的二进制文件

    • Windowsast.exe
    • Linux/macOSast

    这是最终生成的可执行文件,可以直接运行以测试程序功能。

  • 中间对象文件

    .o(Linux/macOS)或 .obj(Windows)文件。这些文件是源代码编译后的中间产物,用于最终的链接阶段。

2. 构建并调试:

  1. 设置断点: 在代码编辑器中, 点击行号左侧以设置断点
  2. 点击右上角的调试按钮:
    在这里插入图片描述
  3. 选择调试配置
    在调试视图的顶部下拉菜单中,选择预先配置的调试配置 "Debug ast"(该名称是launch.json文件中自定义的)。该配置在 launch.json 文件中定义,指定了调试器类型、目标可执行文件、启动参数等。
    在这里插入图片描述
    在这里插入图片描述
    之后会自动构建并执行代码到断点处进行调试


http://www.ppmy.cn/ops/161618.html

相关文章

Java注解的原理

目录 问题: 作用: 原理: 注解的限制 拓展: 问题: 今天刷面经,发现自己不懂注解的原理,特此记录。 作用: 注解的作用主要是给编译器看的,让它帮忙生成一些代码,或者是帮忙检查…

洛谷 P3628/SPOJ 15648 APIO2010 特别行动队 Commando

题意 你有一支由 n n n 名预备役士兵组成的部队,士兵从 1 1 1 到 n n n 编号,你要将他们拆分成若干特别行动队调入战场。出于默契的考虑,同一支特别行动队中队员的编号应该连续,即为形如 i , i 1 , ⋯ , i k i, i 1, \cdo…

深度学习中卷积层(Conv)、BN层(Batch Normalization)和 ReLU层(Rectified Linear Unit)的详细介绍

一、卷积层(Conv) 定义 卷积层是深度学习中卷积神经网络(CNN)的核心组成部分。它通过对输入数据(如图像)进行卷积操作来提取特征。卷积操作是用一个卷积核(也称为滤波器)在输入数据上…

华为数通Datacom认证体系详解:从HCIA到HCIE的进阶路径

华为数通Datacom(Data Communication)课程是华为认证体系中的核心方向之一,聚焦企业网络通信与数据通信技术,适合从事网络规划、部署和运维的人员。 一、数通Datacom课程体系 华为数通Datacom认证分为 三个级别,逐级递…

ARP协议的工作原理

ARP(Address Resolution Protocol,地址解析协议)的工作原理是通过请求-响应的方式,将目标设备的IP地址解析为对应的MAC地址。以下是ARP协议的工作原理的详细步骤: 1. ARP请求(ARP Request) 当设…

【MySQL】索引(上)

欢迎拜访:雾里看山-CSDN博客 本篇主题:【MySQL】索引(上) 发布时间:2025.2.26 隶属专栏:MySQL 目录 初始索引基本介绍常见索引分类案例使用 认识磁盘MySQL 与 存储关于磁盘关于扇区定位扇区结论磁盘随机访问(Random Access)与连续…

dataSource already closed

之前的代码是单线程跑,由定时任务触发,考虑到以后数据量可能变大,就改用多线程处理,改完之后进行单元测试报错: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nes…

LLC谐振变换器恒压恒流双竞争闭环simulink仿真

1.模型简介 本仿真模型基于MATLAB/Simulink(版本MATLAB 2017Ra)软件。建议采用matlab2017 Ra及以上版本打开。(若需要其他版本可联系代为转换)针对全桥LLC拓扑,利用Matlab软件搭建模型,分别对轻载&#xf…