文章目录
- 引言
- 1. 找不到 opencv2/opencv.hpp 头文件
- 1.1 不使用 Code Runner 插件时
- 1.2 使用 Code Runner 时
- 2. 直接点击编译成功的 .exe 文件报错
引言
使用 VSCode 搭建 OpenCV 环境大致的步骤如下:
- 下载 VSCode 和 MinGW,搭建基本的 C/C++ 运行环境
- 下载并配置 CMake
- 下载 OpenCV,使用 CMake 编译 OpenCV 源码
- 在 VSCode 中配置 OpenCV,使得可以在 VSCode 中使用 OpenCV 相关的类库
1. 找不到 opencv2/opencv.hpp 头文件
如果按照上述文章配置完成之后,并且已经检查了环境变量等的配置信息确认无误,但是依然找不到头文件,有可能是因为使用了 VSCode 的 Code Runner 插件。在使用和不使用插件时配置是不一样的:
1.1 不使用 Code Runner 插件时
当 VSCode 不使用 Code Runner 插件时,cpp 文件的运行方式如下图所示:
此种方法的编译命令通过 tasks.json 和 launch.json 两个文件配置,配置样例如下:
// tasks.json
{
// https://code.visualstudio.com/docs/editor/tasks
"version": "2.0.0",
"tasks": [
{
"label": "Build", // 任务的名字叫Build,注意是大小写区分的,等会在launch中调用这个名字
"type": "shell", // 任务执行的是shell命令,也可以是其他
"command": "g++", // 命令是g++
"args": [
"${file}", //当前文件名
// 扩展参数
// -I 头文件目录
// -L 库文件目录
// -l 库文件
"-I", "D:/opencv/build/include",
"-I", "D:/opencv/build/include/opencv2",
"-L", "D:/opencv/build/x64/MinGW/lib",
"-l", "libopencv_core451",
"-l", "libopencv_imgproc451",
"-l", "libopencv_imgcodecs451",
"-l", "libopencv_video451",
"-l", "libopencv_ml451",
"-l", "libopencv_highgui451",
"-l", "libopencv_objdetect451",
"-l", "libopencv_flann451",
"-l", "libopencv_imgcodecs451",
"-l", "libopencv_photo451",
"-l", "libopencv_videoio451",
"-o", //对象名,不进行编译优化
"${fileDirname}/${fileBasenameNoExtension}.exe", //当前文件名(去掉扩展名)
],
// 所以以上部分,就是在shell中执行(假设文件名为filename.cpp)
// g++ filename.cpp -o filename.exe
"group": {
"kind": "build",
"isDefault": true
// 任务分组,因为是tasks而不是task,意味着可以连着执行很多任务
// 在build组的任务们,可以通过在Command Palette(F1) 输入run build task来运行
// 当然,如果任务分组是test,你就可以用run test task来运行
},
"problemMatcher": [
"$gcc" // 使用gcc捕获错误
],
}
]
}
其中 args 即编译命令参数,VSCode 会根据 args 中所指定的参数拼接出编译命令。上边的配置中通过 -I、-L、-l 指明了opencv 的头文件目录,库文件目录等信息。编译时会到指定的地方找。
// launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch", //这个应该是F1中出现的名字
"preLaunchTask": "Build", //在launch之前运行的任务名,这个名字一定要跟tasks.json中的任务名字大小写一致
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}.exe", //需要运行的是当前打开文件的目录中,名字和当前文件相同,但扩展名为exe的程序
"args": [],
"stopAtEntry": false, // 选为true则会在打开控制台后停滞,暂时不执行程序
"cwd": "${workspaceFolder}", // 当前工作路径:当前文件所在的工作空间
"environment": [],
"externalConsole": false, // 是否使用外部控制台,选false的话,我的vscode会出现错误
"MIMode": "gdb",
"miDebuggerPath": "D:/mingw64/bin/gdb.exe",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
1.2 使用 Code Runner 时
当使用 Code Runner 插件时,cpp 程序直接点击右上角小三角运行:
此时代码的编译命令不是通过 tasks.json 文件中的配置来拼接,而是通过在 settings.json 文件中配置 code-runner.executorMap 实现。
// settings.json
"code-runner.executorMap": {
"javascript": "node",
"java": "cd $dir && javac $fileName && java $fileNameWithoutExt",
"c": "cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
"cpp": "cd $dir && g++ $fileName -I D:/opencv/build/include -I D:/opencv/build/include/opencv2 -L D:/opencv/build/x64/MinGW/bin -l libopencv_core451 -l libopencv_imgproc451 -l libopencv_imgcodecs451 -l libopencv_video451 -l libopencv_ml451 -l libopencv_highgui451 -l libopencv_objdetect451 -l libopencv_flann451 -l libopencv_imgcodecs451 -l libopencv_photo451 -l libopencv_videoio451 -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
"objective-c": "cd $dir && gcc -framework Cocoa $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
"php": "php",
"python": "python -u",
"perl": "perl",
"perl6": "perl6",
...
},
主要是 cpp 的配置,所指定的内容和 tasks.json 中指定的一样,即指明 -I、-L、-l。
2. 直接点击编译成功的 .exe 文件报错
报错信息如下:
这是因为程序在运行的过程中无法找到动态链接库(即之前 -l 所指定的那些 .dll 文件)造成的,将指定 .dll 文件所在目录添加到环境变量中即可。