Linux环境下使用VScode调试CMake工程

在上一篇文章中,介绍了使用Linux中的g++对简单C++代码进行编译的过程,本文将介绍如何在VSCode中对一个CMake工程进行编译调试。

对C++编译过程、g++编译器、gdb调试器不了解的,可以先看这两篇文章:

为什么要用CMake?高翔博士的《视觉SLAM十四讲》给出了很好的解释:

理论上,任意一个C++程序都可以用g++ 来编译。但当程序规模越来越大时,一个工程可能有许多个文件夹和源文件,这时输入的编译命令将越来越长。通常,一个小型 C++ 项目可能含有十几个类,各类间还存在着复杂的依赖关系。其中一部分要编译成可执行文件,另一部分编译成库文件。如果仅靠 g++命令,则需要输人大量的编译指令,整个编译过程会变得异常烦琐因此,对于 C++项目,使用一些工程管理工具会更加高效。
CMake就是一个方便的C++工程管理工具。

1. 演示文件目录

本文中用以演示的CMake工程目录如下:

|—— build
|—— helloCMake.cpp
|—— CMakeLists.txt

build文件夹用于存放cmake生成的中间文件。另外两个文件的内容如下:

// helloCMake.cpp
#include <iostream>
using namespace std;
int main(int argc, char **argv){
    
    
	cout << "Hello, VSCode and CMake!" << endl;
    
    if ( argc >=2 ) {
    
    
        cout << "args[1]: " << string(argv[1]) << endl;
        cout << "args[2]: " << string(argv[2]) << endl;
    }

    return 0;
}
# CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(vscode_cmake)

add_executable(helloCMake helloCMake.cpp)

2. CMake编译

如果不使用VSCode,而是使用终端命令行方式进行cmake编译的话,标准做法是:

cd build
cmake ..
make

这样在build目录下就会生成cmake中间文件,以及一个最终的可执行文件helloCMake,工程目录将会如下所示:

├── build
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   ├── Makefile
│   ├── cmake_install.cmake
│   └── helloCMake
├── CMakeLists.txt
└── helloCMake.cpp

执行helloCMake(执行时附带参数 para1para2),结果为:

./helloCMake para1 para2
Hello, VSCode and CMake!
args[1]: para1
args[2]: para2

3. VSCode中实现CMake编译

那么,如何把上面的过程配置在VSCode中?具体步骤如下:

  1. 在VSCode的主菜单中,选择 Terminal>Configure Default Build Task
  2. 选择 “CMake: build”
  3. 将生成一个 tasks.json文件,将其中的内容替换为以下内容即可:
{
    
    
	"version": "2.0.0",
	"tasks": [
        {
    
    
            "label": "cmake",
            "type": "shell",
            "command": "cmake",
            "args": [
                "../"
            ],
            "options": {
    
    
                "cwd": "${fileDirname}/build"
            },            
        },
        {
    
    
            "label": "make",
            "type": "shell",
            "command": "make",
            "args": [],
            "options": {
    
    
                "cwd": "${fileDirname}/build"
            }, 
        },
        {
    
    
            "label": "build",
            "dependsOn":["cmake", "make"]
        },
    ],
}

可以看出,上面的 tasks.json 文件主要包含三个命令:

  • label为cmake的任务:执行shell类型的cmake命令,其参数为 ../,执行时所在的目录为${fileDirname}/build。这个命令等价于在build目录下执行cmake ../
  • label为make的任务:执行shell类型的make命令,没有参数,执行时所在的目录为${fileDirname}/build。这个命令等价于在build目录下执行make
  • label为build的任务:该任务由cmake和make任务组成,也就是将上面两条命令执行的过程组合成一个build任务。

所以执行build任务,相当于在build目录下执行了 cmake ../make 两条命令,完成了 CMake的编译过程。

  • 在VSCode的主菜单中,选择 Terminal>Run Task…,然后选择 build ,再选择 “continue without scanning the task output”,可以在编辑器下方的终端显示界面中看到,VSCode执行完成了cmake和make两个任务:
    cmake任务make任务
    此时的工程文件将与第2节使用命令行完成CMake编译一样,因为两种方式的本质是完全一样的。

4. VSCode中调试CMake工程代码

如上所述,完成CMake编译过程后,将会在 build 目录下生成一个可执行文件helloCMake,下面将介绍如何在VSCode中对其进行调试:

  1. 在VSCode的上方菜单中,选择 Run -> Add Configuration,会生成一个空白的launch.json文件:
 {
    
    
    "version": "0.2.0",
    "configurations": []
}
  1. 我们要做的就是在该文件中告诉VSCode:用gdb调试前面生成的可执行文件,在launch.json文件中添加如下内容:
{
    
    
    "version": "0.2.0",
    "configurations": [
        {
    
    
            "name": "g++ - Build and debug active file",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/build/${fileBasenameNoExtension}",
            "args": ["para1", "para2"],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
    
    
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "build",
            "miDebuggerPath": "/usr/bin/gdb"
        }
    ]
}

其中,

  • "program":用于指定要调试的可执行文件,这里用变量名指代,其值就是helloCMake
  • "args":执行代码时,需要添加的命令行参数
  • prelaunchTask:在执行gdb调试前,预先需要执行的任务,这里设置为"build",就是指定第3节中配置完成的build任务,即在gdb调试前,先执行cmake和make
  1. 回到 helloCMake.cpp 文件,打上断点,然后按F5,即可实现代码调试:
    Debug

5. 参考教程

  1. Linux下使用VS Code + CMake 调试c++程序
  2. Linux环境使用VSCode调试简单C++代码

猜你喜欢

转载自blog.csdn.net/hypc9709/article/details/129430861