【进阶】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 文件夹
sh 复制代码
git clone https://github.com/gabime/spdlog.git

目标

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

目录结构说明

D:/code/cpp 目录下:

sh 复制代码
├─.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

    json 复制代码
    	"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 依赖:
sh 复制代码
if(NOT DEFINED CMAKE_PREFIX_PATH)
    set(CMAKE_PREFIX_PATH "D:/code/cpp/dist" CACHE PATH "默认依赖路径")
endif()
  1. 修改 settings.json 指定源码路径, 刷新缓存后,点击生成按钮,默认生成到 D:/code/cpp/build/ 目录:
json 复制代码
"cmake.sourceDirectory": "D:/code/cpp/test/spdlog",

生成及调试操作按钮:

4. 可视化调试

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

二、命令行方式

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

    a. Ctrl + Shift + P -> Create New Terminal 选择 bash(MSYS2)

    b. 或点击终端右上角 + , 选择默认配置文件并选择,每次打开默认使用。

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

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

shell 复制代码
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 依赖问题定位:通过 cmake -LAH 查看缓存变量,是否包含错误路径。

END

如果这篇文章对您有所帮助,欢迎点赞、分享和留言,让更多的人受益。感谢您的细心阅读,如果发现了任何错误或需要补充的地方,请随时告诉我,我会尽快处理 _

相关推荐
xlp666hub1 天前
Leetcode 第三题:用C++解决最长连续序列
c++·leetcode
会员源码网1 天前
构造函数抛出异常:C++对象部分初始化的陷阱与应对策略
c++
xlp666hub1 天前
Leetcode第二题:用 C++ 解决字母异位词分组
c++·leetcode
不想写代码的星星1 天前
static 关键字:从 C 到 C++,一篇文章彻底搞懂它的“七十二变”
c++
xlp666hub2 天前
Leetcode第一题:用C++解决两数之和问题
c++·leetcode
不想写代码的星星2 天前
C++继承、组合、聚合:选错了是屎山,选对了是神器
c++
不想写代码的星星3 天前
std::function 详解:用法、原理与现代 C++ 最佳实践
c++
樱木Plus5 天前
深拷贝(Deep Copy)和浅拷贝(Shallow Copy)
c++
blasit7 天前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
肆忆_8 天前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++