在windows下为mingw配置opencv
快速上手
安装dev c++或者小熊猫c++
这里推荐使用小熊猫c++,他就是dev c++的pro max版本,在保持样式基本相同的同时,有很多代码高亮,提示等功能。下载链接
这是官网链接:http://royqh.net/redpandacpp/
安装过程一路默认,只需要修改你所安装的位置即可。
下载已经编译好的opencv
github realese链接
注意,下载时需要和你电脑本地的mingw版本号为位数相对应才可以正常使用。
下载后,将其解压在某个具体的路径,如下:
配置编译器
点击工具
->选项
->编译器
接下来,分别添加bin文件,lib文件目录和include目录
注意,选择的目录为你所解压的opencv文件所在的目录。
最后,在链接时添加如下选项,即完成opencv的配置。
1 | -lopencv_core455 -lopencv_imgproc455 -lopencv_highgui455 -lopencv_imgcodecs455 -lopencv_videoio455 -lopencv_calib3d455 -lopencv_features2d455 -lopencv_objdetect455 -lopencv_flann455 -lopencv_ml455 -lopencv_photo455 -lopencv_stitching455 -lopencv_video455 -lopencv_dnn455 -lopencv_gapi455 |
到这为止。你就可以快乐的使用OpenCV去完成开发内容了(下面的内容可以忽略)
VSCode+CMake下的配置
前置内容
可以看到,在上面的配置中,我们只能使用dev c++
和小熊猫c++
,而且链接时需要写一大串内容。如果在更换工作环境时or帮助别人配置环境时,总是要有这么一大串要静态链接的内容。就感到颇为麻烦。
所以思考能不能优化链接的方式,通过通配符直接完成所有静态库的引用和链接。于是选择了使用CMake+VSCode
的方式来完成配置(你用CLion也是可以的)
关于静态库和动态库的区分:
然后,不难发现;在opencv的bin目录下都是已经经过编译的动态库文件(以.dll
结尾)
而在lib文件中,则是与这些动态库文件相对应的静态库文件(以.dll.a
结尾):
关于为什么会是这样子的一个形式,可以查看MingW
编译时为动态库时的选项,这里仅提供一个参考的链接MingW下动态链接库常识
大抵就是说这些静态库文件并不具备具体的函数实现。他的作用只是对动态库的一个声明,方便程序在运行时自动寻找到动态库。(个人看法,不一定正确)(这样子的情况在MSVC编译器下也存在,只是表达方式不一样而已)
所以我们可以明确我们要配置opencv就是要:
在编译的时候,添加上include头文件和静态库文件。在运行时让他可以找到动态库文件
编译部分
文件目录如下:
此时我们使用CMake
(默认你们已经下载好VSCode和CMake插件等)CMakeLists.txt
的内容如下:
1 | cmake_minimum_required(VERSION 3.10) |
cmake_minimum_required
此命令指定了构建项目所需的最低CMake版本project
该命令定义了项目的名称,这里项目命名为CVadd_executable(Test main.cpp)
此命令将创建一个名为Test的可执行文件,并将main.cpp作为源文件进行编译。file(GLOB YOU_FILE_LIST_NAME DIRECTION)
file()命令用于创建一个包含所有符合指定路径模式的文件的列表。可以使用通配符include_directories()
此命令指定了包含目录,即Include的目录target_link_libraries(Test ${OPENCV_LIBS})
此命令将前面获取到的OpenCV静态库链接到目标Test。OPENCV_LIBS变量包含了所有需要链接的库文件,CMake会将它们与Test目标进行链接
当你ctrl+s
保存后,CMake会自动帮你配置。你只需要点击屏幕下的build
按钮
然后你就可以看到build目录下有一个Text.exe
文件,即完成了编译工作了。
运行
此时,我们点击该文件运行,却发现仍然有错误:显示缺少动态运行库
对,这很合理,因为你只为它链接了动态库的imp-lib
,他会去寻找动态库在哪。但是因为你没有为他配置动态库,所以他找不到。于是再次报错。
这里提供几个解决方法:
把
bin
目录下所有的dll
文件复制到EXE文件目录,或者把EXE文件放到OpenCV
的bin
目录下,就可以直接运行。(这个方法有点笨,但最简单有效,而且不会污染开发环境)把
OpenCV
的bin目录放到PATH
下。如图:
这种方法也简单,但是考虑到我并不会长期使用OpenCV,可能只是应付上课or什么的。所以我也不想污染我的环境。所以还有最后一个方法使用
VSCode
的launch调试工具
他需要你创建一个
launch.json
用于启动你运行的程序
具体内容如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25{
"version": "0.2.0",
"configurations": [
{
"name": "Debug with MinGW GDB",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/Test.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [
{
"name": "PATH",
"value": "D:/Program Files/OpenCV/OpenCV-MinGW-Build-OpenCV-4.5.5-x64/x64/mingw/bin;${env:PATH}"
}
],
"externalConsole": true,
"MIMode": "gdb",
"miDebuggerPath": "C:/Program Files/RedPanda-Cpp/MinGW64/bin/gdb.exe",
}
]
}在上述代码中:
program
这个字段指定了要调试的可执行文件路径cwd
这是程序的当前工作目录,即你的程序跑起来是的根目录,如果你有通过相对路径读取文件的话,比如我读取的lena.jpg
他就应该在这个目录下,他通常就是你的cpp所在的目录。environment
该字段定义了调试会话的环境变量,这里就是最重点的部分,你在这里添加上OpenCV的bin目录的路径,然后就他就可以在调试中启动。既不污染电脑的环境,也达到了跑程序的目的externalConsole
这个字段设置为 true,表示调试时会启动一个外部终端窗口。方便截图提交作业( •̀ ω •́ )ymiDebuggerPath
该字段指定了 GDB 调试器的路径,就是你的MinGW
的bin目录下的gdb程序
上述是我认为稍微重点的部分,其他更多的参数配置请查询官网。
至此。再点击launch
运行该程序,同时你还可以给你的程序打断点进行调试。
于是,所有的配置部分都圆满结束。