文章目录

  • 引言
  • 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 文件的运行方式如下图所示:

为什么linux vscode python opencv没有语法提示 vscode opencv.hpp_vscode

此种方法的编译命令通过 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 程序直接点击右上角小三角运行:

为什么linux vscode python opencv没有语法提示 vscode opencv.hpp_opencv_02

此时代码的编译命令不是通过 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 文件报错

报错信息如下:

为什么linux vscode python opencv没有语法提示 vscode opencv.hpp_opencv_03

这是因为程序在运行的过程中无法找到动态链接库(即之前 -l 所指定的那些 .dll 文件)造成的,将指定 .dll 文件所在目录添加到环境变量中即可。