vscode配置opencv环境,包括opencv源码编译(mingw64 + cmake)

vscode使用了mingw64,在使用官网下载的opencv后,发现有函数提示功能,但是在调试时出现了各种opencv库中的各种函数未定义的情况(如下图代码所示的类型),然后突然明白过来,既然使用了mingw,那么相对应的opencv也应该使用mingw版本,但是官网不提供该版本的下载,那就只能自己编译一个该版本出来。

C:\Eulerian Real-Time OpenCV build\Realtime-Video-Magnification-master\build-rvm-Desktop_Qt_5_9_0_MinGW_32bit-Debug\debug\main.o:-1: In function `ZN2cv6StringaSERKS0_':

E:\opencv\build\include\opencv2\core\cvstd.hpp:672: error: undefined reference to `cv::String::deallocate()'

C:\Eulerian Real-Time OpenCV build\Realtime-Video-Magnification-master\src\main\threads\CaptureThread.h:42: error: undefined reference to `cv::VideoCapture::~VideoCapture()'

注意:使用的工具版本如下,一定要注意版本问题,如果使用的mingw64版本和opencv版本不对应,那简直是一个天坑,将会在mingw64-make 的时候无限报错,这简直能折磨死人。

  • 首先提供一个opencv mingw版本的下载地址:

opencv-mingw

  • 我的编译环境

mingw64-4.8.1

opencv-3.4.1

cmake-3.10,0

  • 安装mingw64和cmake,记得首先配置mingw64和cmake的环境变量
  • 打开cmake-gui
  1. 设置源码目录和编译目录
  2. 电机configure,设置编译器为MinGW Makefiles
  3. 如果设置好了环境变量,下方默认即可
  4. 点击finish
  5. 配置完成后,一片红,不要着急
  6. 勾选ENABLE_CXX11和WITH_OPENGL,不勾选ENABLE_PRECOMPILED_HEADERS和WITH_IPP
  7. 注意mingw64/x86_64-mingw32/include/aviriff.h文件第一行的注释少了一个“/”,添加,然后保存(此步骤非必须)
  8. 继续点击cmake-gui的configure,配置结束后点击generate即可
  9. 通过cmd进入编译目录,执行mingw32-make -j 8
  10. 无错误后,执行mingw32-make install
  • 配置vscode和opencv环境

ERROR: During startup program exited with code 0xc0000135.    

  1. 配置c_cpp_properties(今天大概服务器有问题,代码一粘贴网页就卡死,先跳过这三个配置文件,改天来补充)

{

                    "configurations": [

                          {

                                            "name": "Win32",

                                            "includePath": [

                                                    "D:/opencv-3.4.1/mingw-x64-install/install/include",

                                                    "${workspaceFolder}/**",

                                                    "D:/opencv-3.4.1/mingw-x64-install/install/include/opencv",

                                                    "D:/opencv-3.4.1/mingw-x64-install/install/include/opencv2"

                                                                   ],

                                             "defines": [

                                                      "_DEBUG",

                                                     "UNICODE",

                                                      "_UNICODE"

                                                            ],

                                            "compilerPath": "D:\\mingw64\\bin\\gcc.exe",

                                           "cStandard": "c11",

                                          "cppStandard": "c++17",

                                         "intelliSenseMode": "clang-x64"

                   }

          ],

       "version": 4

}

 请注意:关键代码为  "includePath"里的内容,这里需要将opencv里的头文件包含进来。

  1. 配置launch

{

        "version": "0.2.0",

        "configurations": [

               {

                                  "name": "(gdb) Launch", // 配置名称,将会在启动配置的下拉菜单中显示

                                  "type": "cppdbg", // 配置类型,这里只能为cppdbg

                                  "request": "launch", // 请求配置类型,可以为launch(启动)或attach(附加)

                                 "program": "${workspaceRoot}/build/${fileBasenameNoExtension}.exe",// 将要进行调试的程序的路径

                                  "args": [], // 程序调试时传递给程序的命令行参数,一般设为空即可

                                "stopAtEntry": false, // 设为true时程序将暂停在程序入口处,一般设置为false

                                "cwd": "${workspaceRoot}", // 调试程序时的工作目录,一般为${workspaceRoot}即代码所在目录

                              "environment": [],

                               "externalConsole": true, // 调试时是否显示控制台窗口,一般设置为true显示控制台

                               "MIMode": "gdb",

                               //"miDebuggerPath": "D:\\Mingw\\bin\\gdb.exe",

                               "miDebuggerPath": "D:\\mingw64\\bin\\gdb.exe", // miDebugger的路径,注意这里要与MinGw的路径对应

                               "preLaunchTask": "g++", // 调试会话开始前执行的任务,一般为编译程序,c++为g++, c为gcc

                               "setupCommands": [

                                              {

                              "description": "Enable pretty-printing for gdb",

                                                "text": "-enable-pretty-printing",

                                               "ignoreFailures": true

                                            }

                               ]

                     }

           ]

}

请注意:此处的关键代码为"miDebuggerPath"里的语句,里面包含gdb.exe的目录地址; "program"里为调试程序的路径,之所以放到build里,是因为如果包含了动态链接库,那么动态链接库需要拷贝到和编译的.exe文件相同目录下,和tasks.json文件里的args参数相对应。

  1. 配置tasks 

{

                         "version": "2.0.0",

                        "command": "g++",

                        "args": ["-g","${file}","-o","build/${fileBasenameNoExtension}.exe",

                                    "-I", "D:/opencv-3.4.1/mingw-x64-install/install/include",

                                    "-I", "D:/opencv-3.4.1/mingw-x64-install/install/include/opencv",

                                   "-I", "D:/opencv-3.4.1/mingw-x64-install/install/include/opencv2",

                                  "-L", "D:/opencv-3.4.1/mingw-x64-install/install/x64/mingw/bin/lib*",

                                 ],

                       "problemMatcher": {

                                        "owner": "cpp",

                                        "fileLocation": ["relative", "${workspaceRoot}"],

                                         "pattern": {

                                                "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",

                                                "file": 1,

                                                "line": 2,

                                               "column": 3,

                                               "severity": 4,

                                                "message": 5

                                              }

                      }

}

注意:这里的关键代码是args里的参数,这里“-g”定义了编译出的.exe文件的存放目录(和c_cpp_properties文件相对应),“-I”里的参数和c_cpp_properties文件相对应,“-L”里定义了所编译出的opencv里的库文件的包含目录(需要拷贝到和.exe相同目录)。

  1. 写测试代码后,执行,发现console一闪而逝,无报错。
  2. 上述错误,是因为引入的库没有正确链接到导致的,将之前编译好的opencv-mingw包里的install/x64/mingw/bin里的文件拷贝出来,拷贝到vscode中测试代码的当前目录,再次执行,发现控制台不再消失,一切正常。
  3. 经过测试后发现,这是因为在windows下所编译出的.exe文件(通过task.json配置)需要和库文件在同一个目录,所以养成良好的工作目录环境配置是必要的。
  4. 建议的目录:

          workspace

                          .vscode

                                     c_cpp_properties.json

                                     launch.json

                                     tasks.json

                          include

                               (所包含的头文件等,建议,也可以直接将头文件放在src)

                          build

                                 (各种库文件等依赖的内容)

                          src

                               (源码)

猜你喜欢

转载自blog.csdn.net/weixin_39079670/article/details/88657435