在ubuntu下为了调试C++代码能够和在win上的VS一样方便,就需要一个IDE,而vscode就是一个不错的选择,每次在新的机器上安装完,需要进行一些基本设置,才能够用的顺手。
1、主题
记得一定不要选高对比度外观,否则#ifdef这个非活动模块也不能够变暗;
2、扩展
C/C++、C/C++ Extension Pack、C/C++ Themes、CMake、CMake Tools、Chinese(简体中文);
3、设置
Font Size: 16
Font Family: monospace
4、调试
踩坑后发现,vscode中即使你写好了CMakelist且CMake编译能成功,也是不能调试的,这是因为调试工具gbd没有解析CMake里面的内容,正确的方式是去配置task.json和launch.json,这两个文件起初是没有的,当你点击vscode的“添加调试配置”按钮(通常是窗口右上角一个齿轮形状的按钮,弹出几个选项,选择见下图),选择完毕后,.vscode(隐藏目录)下会生成launch.json和task.json模板文件。
这里再提一点,就是其他博客还配置了c_cpp_properties.json文件,我实测下来可以不用配置,按照我的步骤来即可。
现在以一个简单的例子来说明,现在我们本身有一个main.cpp和CMakelist.txt文件,内容如下,测试功能是1、传入参数,2、定义宏,3、调用opencv库的部分功能,4、使用C++17的filesystem。
CMakelist.txt文件:
#可能与上面略有差异,是因为我几年过后再回头过了一遍,用的代码略有不同,但不影响整体
cmake_minimum_required(VERSION 3.5)
add_compile_options(-std=c++17 -O3)#-Og
set(CMAKE_BUILD_TYPE Release)
project(vscode-gdb-opencv)
find_package(OpenCV REQUIRED)
message(STATUS "opencv include path is: " ${OpenCV_INCLUDE_DIRS})
message(STATUS "opencv lib path is: " ${OpenCV_LIBS})
include_directories(${OpenCV_INCLUDE_DIRS})
FILE(GLOB CPP_FILE1 ${PROJECT_SOURCE_DIR}/src/*.cpp)
add_executable(test ${CPP_FILE1})
target_link_libraries(test ${OpenCV_LIBS} -lstdc++fs)
main.cpp文件
//可能与上面略有差异,是因为我几年过后再回头过了一遍,用的代码略有不同,但不影响整体
#include <string>
#include <opencv2/opencv.hpp>
int main(int argc, char *argv[])
{
using namespace std;
using namespace cv;
string path = R"(/home/work/temp/bin/2024_05_27_11_04_35.png)";
Mat mat = imread(path);
Mat mat1 = Mat::zeros(10,10,CV_8UC3);
return 0;
}
现在简单说一下launch.json文件,这里主要用来传参,打开该文件,然后修改里面的args就对应C++的main函数的char* argv[],如下:
最后说较为复杂的task.json,前面我们说gbd并不会解析CMakelist.txt里面的内容,所以我们需要在task.json去链接头文件目录、库文件目录、库文件名、宏定义、C++17等编译时的各种配置。
这里需要注意的是!!!CMakelist.txt和task.json是完全不关联的,如果你在CMakelist.txt定义了宏,但是task.json没有定义,那么调试时是没有宏的,如果你在CMakelist.txt加了C++17的定义并且代码有相关内容,但是task.json没有添加C++17的定义,那么就会报错。
//可能与上图路径略有差异?是需要根据自己的实际路径去配置的,要灵活,懂?
"-I", "/usr/local/include/opencv4",
"-I", "/usr/local/include/opencv4/opencv",
"-I", "/usr/local/include/opencv4/opencv2",
"-L", "/usr/local/lib",
"-l", "opencv_core",
"-l", "opencv_highgui",
"-l", "opencv_imgcodecs",
"'-std=c++17'",
"-l", "stdc++fs",