Linux下使用VS Code + CMake 调试c++程序
Linux下使用VS Code + CMake 调试c++程序
基于 Deepin 15.9.3 操作系统
文中使用到的gcc/g++、gdb、makefile、cmake等命令在使用之前需要先安装,安装方法请自行搜索。
cmake入门教程:CMake入门教程
makefile教程:跟我一起写 Makefile
一、基础知识
在linux系统下,c/c++的编译器大多使用gcc/g++。在命令行中输入命令即可完成对源代码的编译运行。
例如:
在桌面上创建一个“test”文件夹,在文件夹中新建文件“test.cpp”,代码如下:
-
#include <iostream>
-
using namespace std;
-
-
int main(void)
-
{
-
cout<<"test"<<endl;
-
return 0;
-
}
使用以下命令对其进行编译。
g++ -o test -g -Wall test.cpp
“-g”表示在编译时加入调试信息,以便使用GDB进行调试。如果不加“-g”,编译出的程序便无法使用GDB进行调试。“-Wall”表示编译时列出所有警告信息。编译完成后,目录下会生成一个“test”文件,即是编译生成的可执行文件。输入“./test"命令即可执行。
二、makefile和cmake
cmake和makefile入门教程在文章开头给出了参考链接,可自行学习。
但是一个项目中只有一个源文件的概率几乎为零。如果每个源文件都在终端中使用g++命令手动编译,无疑会很繁琐。通常使用makefile来管理众多的源文件和头文件,这样只需要在终端中输入”make“即可对项目中众多的文件进行编译。
makefile文件的写法这里不再介绍,但是要知道即使有了makefile,要手动书写一个项目的makefile文件,也是及其繁琐的事情。这里我们使用cmake来自动生成makefile文件。
此处以我已经建立好的测试项目为例。
其中src目录中保存源文件,inc目录中保存头文件,build目录中保存编译自动生成的文件,CMakeLists.txt是cmake需要的配置文件,其内容如下:
-
# CMake最低版本要求
-
cmake_minimum_required(VERSION 2.8)
-
-
# 项目信息
-
project(AdaptiveMedianFilter)
-
-
# 查找包, opencv使用
-
find_package(OpenCV REQUIRED)
-
-
# 添加头文件路径
-
include_directories(${CMAKE_CURRENT_LIST_DIR}/inc)
-
-
# 添加源文件路径,并将其保存在变量source_path中
-
aux_source_directory(${CMAKE_CURRENT_LIST_DIR}/src source_path)
-
-
# 指定生成目标,引用source_path变量
-
add_executable(${PROJECT_NAME} ${source_path})
-
-
# 显式指定编译器
-
set(CMAKE_CXX_COMPILER "g++")
-
-
# 开启调试信息
-
set(CMAKE_BUILD_TYPE "Debug")
-
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")
-
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
-
-
-
# 开启所有警告
-
set(CMAKE_CXX_FLAGS "-Wall")
-
-
# 目标链接库, opencv使用, 表示当前目标文件需要链接库:${OpenCV_LIBS}
-
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})
-
文件中的每一行代码都有注释,此处不再详细解释。
注意:“开启调试信息”那里的三行代码必须要有,否则无法对生成的目标文件进行调试。由于我的小项目中使用到了opencv,因此加了”查找包“和“目标链接库”两行代码,若无需要可不加。其他代码可以根据需要自行添加。
切换到“build”目录下,使用“cmake ../”命令自动生成makefile文件,之后再使用“make”命令即可生成目标文件。
生成的目标文件保存在“build”目录下,可以直接执行,与手动书写makefile文件或者手动编译每个文件生成的目标文件相同。
三、在VS Code中对项目代码进行调试
自行到VS Code官网下载安装VS Code,之后安装C/C++扩展,对代码进行调试需要该扩展程序的支持。
准备工作完成后,在VS Code中打开源代码,打上断点,按F5或者菜单栏的按钮,开始调试:
此时按下F5开始调试,会弹出提示信息窗口,在弹出的选择环境中选择C++(GDB/LLDB),会自动创建一个launch.json文件
默认生成的launch.json文件需要进行更改,才能正常进行调试。
顾名思义,laucn.json的作用是告诉VS Code如何执行调试前的启动任务,也就是我们要把什么文件启动起来。在这里,我的目标文件是“build”目录下的“AdaptiveMedianFilter”,将“program”节点下的内容更改为“${workspaceFolder}/build/AdaptiveMedianFilter”。其中,“${workspaceFolder}”指当前在VS Code中打开的目录,如下图中左侧的红色圈内所示。此外,还要将"externalConsole"节点下的“true”更改为false,否则在每次调试的时候都会打开一个新的终端。
更改完成的文件如下图所示。
在文件一开始有官方文档的链接,如果想要获取更多有关“launch.json”文件的信息,可以访问微软的官方网站查看文档。
此时直接按下F5即可进行调试(源代码中已经有断点,“build目录下已经编译好了目标文件”),如下图所示:
这是在已经手动编译完成目标文件的情况下,才可以正常调试。如果“build”目录下没有生成目标文件,软件会给出以下提示,告诉我们要调试的目标文件不存在:
方便起见,我们希望VS Code在我们点击调试按钮的时候,自动完成目标文件的编译工作,之后再启动调试,这样就不会出现上述错误了,同时在代码更改之后可以保证当前调试的目标文件是根据最后更改的代码所编译生成的。
在“launch.json”文件中,添加一个“preLaunchTask”的节点,并设置值为“build”。这里的build指的是一个名为build的任务,意思是告诉VS Code在开始调试之前,先去完成一个名字叫做“build”的任务,我们在“build”任务中完成对目标文件的编译工作。更改之后的“launch.json”文件如下图所示:
保存文件更改,再次按下F5开始调试,会有以下提示:
这个对话框告诉我们,找不到“build”任务。点击“Configure Task”按钮,之后按一下图示选择:
单击之后,会自动生成一个“tasks.json”文件:
其中的“label”节点的内容即为任务的名称,将其更改为“build”。“type”指任务的命令类型,保持“shell”不变。“command”指将要执行的命令,更改为“make”。此外,还要再增加一个节点。更改后的文件内容如下:
新增的“options”代表一些附加选项,在其中加入“cwd”(current workspace directory,当前工作目录),内容设置为"${workspaceFolder}/build",表示这条命令在"${workspaceFolder}/build"目录下执行,因为我们的makefile文件是保存在这个目录下的,所以make命令必须要在这个目录下执行才可以。
同样的,“tasks.json”文件最上方也有一个微软官方的链接,里面详细记录了“tasks.json”文件的编写方法。
这个时候,再按下F5,就可以对项目进行正常调试了。
但是,有时候,我们会更改“CMakeLists.txt”文件。一旦更改了这个文件,就需要重新执行cmake命令来重新生成makefile文件,以使更改生效。因此,在“tasks.json”文件中再添加一个任务,用以执行“cmake”命令。文件更改之后的内容如下:
由于这里需要先后执行两个任务,因此把之前的任务名称更改为了“make”,并新增了“cmake”任务,在“build”任务中执行“make”和“cmake”两个任务,文件的书写格式如上图所示,使用了”dependsOn“节点。
新增的”cmake“任务,执行命令“cmake ../”。其中的“command”内容指命令名称,这里填入“cmake”,后面的“args”指命令的参数,填入“../”。
至此,就可以在linux系统中借助VS Code中对C++项目进行调试了,免去了命令行使用gdb进行调试的繁琐。
上一篇: 使用VS Code编译调试C++程序