用CMake和MINGW编译OPENCV
前言
相信网络上有不少此类的文章,但尝试过的人,肯定在编译过程中遇到种种err,耗时耗力也不一定能成功编译过。本文通过64 位的 MinGW 在 Windows 下编译 OpenCV 生成 64位的 dll的流程,优化各项配置,顺利通过了编译。32位的方法类似。
4.5.5的版本里没有加入人脸识别算法的代码,因此需要把对应opencv_contrib_4.5.5的额外模块复制到源码文件夹内,一起编译。
这里先把我已经编译好可用的opencv-4.5.5文件分享给大家,包含contrib,但不支持OpenGL,因为编译时选择WITH_OpenGL报错,尚未解决。
https://download.csdn.net/download/weixin_42842157/75820505
OpenCV 的 MSVC 版及 MinGW 版
下载的 OpenCV 文件夹会有:
- build (已编译好的MSVC库)
- sources (源码)
MSVC 版
使用 MSVC 的话,直接在build/x64/vc16(vc后面的数字不同的版本会有变化,选择最新的即可)
里面就有了,配置好路径就可以使用。
MinGW 版
OpenCV 没有为我们编译好 MinGW 版,所以我们只能自己编译,下面就是介绍 MinGW 版的编译流程。
安装及配置 Qt、MinGW、CMake
安装
CMake 自行安装,或者使用Qt安装目录下的CMake(C:\Qt\Tools\CMake_64\bin)。Qt 和 MinGW 可以直接使用qt-opensource-windows-xxx的安装包安装,注意选择安装的组件(components)的时候勾选 MinGW。(该文以Qt 5.15.2、mingw810为例)
配置 Qt、MinGW
安装好后打开 QtCreator,在工具-选项-构建和运行-构建套件,选中Desktop Qt 5.15.2 MinGW 64bit,设为默认,OK。
添加到环境变量
将mingw的路径添加到环境变量 Path中,如 C:\Qt\Tools\mingw810_64\bin
使环境变量生效
打开命令提示符 CMD,运行 set PATH=C:,更改当前窗口任务的环境变量,关闭这个 CMD。
再次打开另一个 CMD,运行 echo %PATH%,显示最新的环境变量,会发现刚刚添加的 MinGW 环境变量已经生效。
使用 CMake 生成 OpenCV 的 Makefile
编译前的准备
修改opencv源代码文件夹中的CMakeLists.txt文件,添加如下代码:
if(MINGW)
# Work around 'too many sections' error with MINGW/GCC
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wa,-mbig-obj")
endif()
【不修改可能会出现以下问题】
编译 opencv/sources/modules/core/perf/opencl/perf_arithm.cpp 时候出错,错误原因是too many sections,file too big,原因是 build 过程中生成的.obj文件是COFF(Common Object File Format)格式,而COFF文件的header里有两位是表示number of sections的,不能超过32766,而这里汇编生成的obj的section超过了这个值,所以直接报错提示file too big
编译器配置
打开 cmake-gui,根据自己的实际路径设置源码和生成路径:
Where is the source code: D:/OpenCV_4.5.5/sources
Where to build the binaries: D:/OpenCV_4.5.5/opencv-build
点击 Configure,设置编译器
- Specify the generator for this project: MinGW Makefiles
- Specify native compilers
- Next
- Compilers C: C:\Qt\Tools\mingw810_64\bin\gcc.exe
- Compilers C++: C:\Qt\Tools\mingw810_64\bin\g++.exe
- Finish
编译配置:
勾选 WITH_QT
不勾选 WITH_OPENGL
勾选 ENABLE_CXX11
不勾选ENABLE_PRECOMPILED_HEADERS
设置Qt5_DIR为C:\Qt\5.15.2\mingw81_64\lib\cmake\Qt5
设置 QT_QMAKE_EXECUTABLE 为 C:\Qt\5.15.2\mingw81_64\bin\qmake.exe
点击 Configure
再次配置:
不勾选 WITH_IPP
设置 CMAKE_BUILD_TYPE 为Release
设置 OPENCV_VS_VERSIONINFO_SKIP为bool型,并选中
设置 CMARK_INSTALL_PREFIX为D:/OpenCV/X64mingw455/install //默认c盘路径需要管理员权限,install时可能报错,建议修改至D盘路径
【以上配置项一般会自动生成,修改value即可;如果没有生成,可点击“Add Entry”新建】
点击 Configure,点击 Generate 生成 Makefile
编译 OpenCV
打开终端进行编译:(-j 是使用 8 个线程进行编译,请根据你的计算机配置合理设置线程数)
D:
cd D:\OpenCV\X64mingw455
mingw32-make -j 8
该过程时间比较长,和计算机性能有关系。其中“-j 8”指的是采用8线程同时编译,但在有些情况下会导致编译错误而终止,这种情况下建议进行单线程编译。
编译完成后显示100%,在终端中运行以下指令,完成安装。
mingw32-make install
一切正常完成后,我们所需要的include、bin和lib文件分别在以下路径,拷贝使用即可。
include: D:\OpenCV\X64mingw455\install\include
bin: D:\OpenCV\X64mingw455\install\x64\mingw\bin
lib: D:\OpenCV\X64mingw455\install\x64\mingw\lib
添加 OpenCV 编译的库到环境变量
为系统变量 Path 添加 D:\OpenCV\X64mingw455\install\x64\mingw\bin
新建 OpenCV 的 Qt 项目
如果cmake配置时CMAKE_BUILD_TYPE 选择了release,那么编译出来的就是 release 库,只能在Qt的 release 模式下使用。
在 .pro 文件里面添加:
win32 {
INCLUDEPATH += D:\OpenCV\X64mingw455\install\include
LIBS += D:\OpenCV\X64mingw455\install\x64\mingw\bin\libopencv_*.dll
}
如果我们还编译生成了 debug库,那么程序中便可通过以下方式,实现自动调用对应的库:
win32 {
INCLUDEPATH += D:\OpenCV\X64mingw455\install\include
CONFIG(debug, debug|release): {
LIBS += D:\OpenCV\X64mingw455\install\x64\mingw\bin\libopencv_*d.dll
}
else:CONFIG(release, debug|release): {
LIBS += -LD:\OpenCV\X64mingw455\install\x64\mingw\bin \
-llibopencv_core455 \
-llibopencv_highgui455 \
-llibopencv_imgcodecs455 \
-llibopencv_imgproc455 \
-llibopencv_features2d455 \
-llibopencv_calib3d455
}
}
然后在 MainWindow 中增加如下包含:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
大功告成,开始coding吧。
可能的错误解决方法
1.错误:modules\core\CMakeFiles\opencv_core.dir\build.make:1506: modules/core/CMakeFiles/opencv_core.dir/vs_version.rc.obj
将CMake中的 OPENCV_ENABLE_ALLOCATOR_STATS 不打勾。
2. 错误:bash [modules\videoio\CMakeFiles\opencv_videoio.dir\build.make:194: modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap_dshow.cpp.obj] Error 1 [CMakeFiles\Makefile2:3112: modules/videoio/CMakeFiles/opencv_videoio.dir/all] Error 2
将sources\cmake文件夹下的"OpenCVCompilerOptions.cmake"文件打开,注释掉如下语句即可。
add_extra_compiler_option(-Werror=non-virtual-dtor)
3.ippicv无法下载
离线下载所需的文件,如ippicv_2020_win_intel64_20191018_general.zip,修改OpenCV\sourcecode\opencv-4.5.4\3rdparty\ippicv文件夹中的ippicv.cmake,将其中的下载url链接修改为本地文件的路径url。注意:格式为"file:///D:/OpenCV/sourcecode/selfdownload/"
4.其他文件下载失败
可离线下载相应文件到所需的文件夹下,存储路径可查看D:\OpenCV\X64mingw455下的CMakeDownloadLog.txt文件。以下链接中我把我编译过程中报错后离线下载的文件打包共享一下。
https://download.csdn.net/download/weixin_42842157/69388183
5.“cannot find -lRunTmChk”
[ 19%] Linking CXX shared library ..\..\bin\libopencv_core454.dll
C:/Qt/Tools/mingw810_64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lRunTmChk
collect2.exe: error: ld returned 1 exit status
mingw32-make[2]: *** [modules\core\CMakeFiles\opencv_core.dir\build.make:1902: bin/libopencv_core455.dll] Error 1
mingw32-make[1]: *** [CMakeFiles\Makefile2:3750: modules/core/CMakeFiles/opencv_core.dir/all] Error 2
mingw32-make: *** [Makefile:165: all] Error 2
不打勾 OPENCV_ENABLE_ALLOCATOR_STATS
不打勾 WITH_IPP
参考:
[1] https://blog.huihut.com/2017/12/03/CompiledOpenCVRunInQt/
[2] https://wiki.qt.io/How_to_setup_Qt_and_openCV_on_Windows