在上一篇文章中,介绍了使用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
(执行时附带参数 para1
和 para2
),结果为:
./helloCMake para1 para2
Hello, VSCode and CMake!
args[1]: para1
args[2]: para2
3. VSCode中实现CMake编译
那么,如何把上面的过程配置在VSCode中?具体步骤如下:
- 在VSCode的主菜单中,选择 Terminal>Configure Default Build Task,
- 选择 “CMake: build”
- 将生成一个
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两个任务:
此时的工程文件将与第2节使用命令行完成CMake编译一样,因为两种方式的本质是完全一样的。
4. VSCode中调试CMake工程代码
如上所述,完成CMake编译过程后,将会在 build 目录下生成一个可执行文件helloCMake
,下面将介绍如何在VSCode中对其进行调试:
- 在VSCode的上方菜单中,选择 Run -> Add Configuration,会生成一个空白的
launch.json
文件:
{
"version": "0.2.0",
"configurations": []
}
- 我们要做的就是在该文件中告诉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
- 回到 helloCMake.cpp 文件,打上断点,然后按F5,即可实现代码调试: