【进阶】vscode 中使用 cmake 编译调试 C++ 工程

在这里插入图片描述
基于 MSYS2 的 MinGW-w64 GCC 工具链与 CMake 构建系统,结合VSCode及其扩展插件( ms-vscode.cmake-tools),可实现高效的全流程C++开发调试。既可通过 VSCode 可视化界面(命令面板、状态栏按钮)便捷完成配置、编译与调试,也可借助命令行灵活控制构建过程。通过 VSCode 强大的扩展生态和智能化工具链,可视化交互、智能代码补全和AI代码生成等功能提高开发效率。

本文以第三方库(如spdlog)集成场景为例演示基本功能,通过合理的CMakeLists.txt配置,可支持复杂项目结构调试,支持断点设置与变量监视功能,实现从简单应用到模块化工程的编译调试管理,Linux+Windows 双重本地开发体验。 更多参考 《Windows 中的 Linux GCC开发工具链》《现代 CMake 实战指南:从基础到进阶》

准备

  1. 安装 MSYS2 GCC 编译工具链
  2. 安装 VSCode 及 CMake 插件
  3. 下载 spdlog 到 temp 文件夹
git clone https://github.com/gabime/spdlog.git

目标

  1. 编译 spdlog 库 并安装到指定路径
  2. 编译 spdlog 示例
  3. vscode 中打断点进行可视化调试
  4. 命令行方式实现

目录结构说明

D:/code/cpp 目录下:

├─.vscode
      └─settings.json # cmake 配置
├─build # cmake 编译生成的临时文件,可删除
├─temp # 第三方库,如 spdlog 源码
├─dist # 编译 spdlog 后安装路径
└─test # 用于 C++ 练习
    ├─helloworld
    └─spdlog # spdlog 示例
        ├─CMakeLists.txt
        └─example # spdlog 示例源码

一、可视化方式

1. 编译 spdlog 库

  1. 修改 settings.json 指定源码、编译、安装路径。
  • 等价于命令行 cmake -SD:/code/cpp/temp/spdlog -BD:/code/cpp/temp/spdlog/build

  • 通过 cmake.installPrefix 指定安装路径,等价于 cmake --install . --prefix D:/code/cpp/dist/spdlog

    	"cmake.sourceDirectory": "D:/code/cpp/temp/spdlog",
    	"cmake.buildDirectory": "D:/code/cpp/temp/spdlog/build",
    	"cmake.installPrefix": "D:/code/cpp/dist/spdlog",
    

重新配置 cmake,清理缓存
在这里插入图片描述

配置输出:
在这里插入图片描述

  1. 选择编译类型 --config Release

在这里插入图片描述

  1. 执行编译,默认生成全部目标,可点击编辑按钮修改

在这里插入图片描述

  1. 编译输出

在这里插入图片描述

2. 安装 spdlog 到 cmake.installPrefix 设置的路径 dist/spdlog

点击运行任务后的按钮,选择 cmake --> cmake 安装任务,将编译结果放到 dist/spdlog

在这里插入图片描述

3. 编译 spdlog example.cpp

  1. 复制 spdlog 根目录下 example 中的文件到 test/spdlog

在这里插入图片描述

  1. 修改 CMakeLists.txt, 指定 spdlog 库的安装路径, 让 find_package(spdlog REQUIRED) 可以找到其 cmake 依赖:
if(NOT DEFINED CMAKE_PREFIX_PATH)
    set(CMAKE_PREFIX_PATH "D:/code/cpp/dist" CACHE PATH "默认依赖路径")
endif()
  1. 修改 settings.json 指定源码路径, 刷新缓存后,点击生成按钮,默认生成到 D:/code/cpp/build/ 目录:
"cmake.sourceDirectory": "D:/code/cpp/test/spdlog",

生成及调试操作按钮:
在这里插入图片描述

4. 可视化调试

  1. 点击源码行号添加断点
  2. 点击调试按钮开始调试, 左边可以查看调试信息、右上角有调试控制按钮,终端中可以查看输出。

在这里插入图片描述

VScode cmake 执行 GTest 测试报错

  1. 无法链接动态库,复制 dll 到可执行文件所在目录,或者采用静态链接。
  2. VScode 无权限,使用管理员权限运行
  3. 通过命令行 在 build 目录执行 ctest
    [ctest] No tests were found!!!
    [ctest] CTest 已完成,返回代码 0
    [ctest] 找不到测试结果。

二、命令行方式

  1. 打开 MSYS2 Linux 命令行环境:

    a. Ctrl + Shift + P -> Create New Terminal 选择 bash(MSYS2)
    b. 或点击终端右上角 + , 选择默认配置文件并选择,每次打开默认使用。
    在这里插入图片描述

  2. 部分指令没有添加到系统环境变量,需要通过 绝对路径访问,也可修改添加到环境变量。可以参考前面的输出找到具体路径。

  3. cmake 命令行编译 spdlog 示例,临时添加的简单第三方库可通过该方式快速编译安装

export PATH=$PATH:/c/msys64/ucrt64/bin # 临时添加环境变量 gcc
export PATH=$PATH:/f/vs/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/bin # cmake
cd D:/code/cpp/test/spdlog
cmake -S. -B./build -G "MinGW Makefiles"
cmake --build ./build
# cmake --install ./build --prefix /d/code/cpp/dist/test # 支持安装到指定目录

CMake 是一个跨平台的构建系统生成器,它支持多种不同的生成器,这些生成器可以为不同的构建工具或环境创建项目文件或构建脚本。MinGW Makefiles 就是这样一种生成器,它用于在 Windows 平台上生成适用于 MinGW 工具链的 Makefile 文件。依据这些文件可以通过 mingw32-make 命令执行编译过程。

cmake 依赖问题定位:通过 cmake -LAH 查看缓存变量,是否包含错误路径。

在这里插入图片描述

END

博客中文章多为自己技术学习与实践备忘录,如果这篇文章对您有所启发或帮助,欢迎👍点赞或↪️分享,让更多开发者朋友受益!感谢您的阅读! ^_^