Windows平台使用CMake+MinGW64编译OpenCV
(注:2年前写的笔记, 可能有些地方过时了)
- Windows平台使用CMake+MinGW64编译OpenCV
- 1.安装及配置环境
- 1.1 MinGW-w64
- 1.2 CMake
- 1.3 OpenCV源码
- 2.CMake配置及生成
- 2.1 新建目录
- 2.2 CMake-GUI
- 2.3 编译配置
- 2.4 生成
- 2.5 Make编译和安装
- 3.配置CMake编译环境
- 3.1 CMAKE_PREFIX_PATH配置
- 3.2 在CMake中引用
- 3.3 dll动态链接引用
- 方法一: 加入PATH环境变量
- 方法二: 直接复制.dll到当前可执行文件所在文件夹
- 4.测试例程
- 4.1 代码
- 4.2 CMake配置和编译
- 4.2.1 配置
- 编译报错:找不到OpenCV
- 4.2.2 编译
- 4.2.3 运行
- 运行报错:找不到dll
- 4.2.1 配置
1.安装及配置环境
1.1 MinGW-w64
编译器使用MinGW-w64:MinGW-w64 - for 32 and 64 bit Windows
注意:安装MinGW-w64时,选择posix接口的Threads,否则编译OpenCV时会一直报错(典型现象是前期会报找不到mutex的错误)
具体安装细节可以参考文章:MinGW-w64安装教程——著名C/C++编译器GCC的Windows版本
将含有gcc.exe的bin文件夹配置环境变量PATH,如
D:\xxx\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin
测试,打开CMD,输入
gcc --version
另外,如果装有QT可以选择使用QT自带的编译器,也是可以进行编译的
1.2 CMake
下载:Download | CMake
安装中会询问是否将CMake添加到PATH环境变量,为了方便可以选择Add CMake to the system PATH for all users
测试,打开CMD,输入
cmake --version
1.3 OpenCV源码
从GitHub下载OpenCV源码,进入网页https://github.com/opencv/opencv,点击Code▼
-Download ZIP
下载zip压缩包
如果有安装git,可以cd到合适的新目录下,然后直接使用git clone https://github.com/opencv/opencv.git
命令下载源码
由于github下载较慢,这里fork了一份源码(2021-11-8)到gitee以供下载:https://gitee.com/chntamap/opencv
完成后文件夹内容如下:
2.CMake配置及生成
2.1 新建目录
在opencv文件夹外新建目录build和install,分别用于放生成文件及编译完成的文件
2.2 CMake-GUI
打开CMake(cmake-gui):
Where is the source code:
选择opencv源代码文件夹
Where to build thr binaries:
选择build文件夹
点击Configure
进行配置,弹出的窗口中下拉选择MinGW Makefiles
,单选框直接选择Use default native compilers
,如果前面配置OK的话,CMake应该可以自动检测到编译器所在位置的
如果CMake在Configure
过程中报找不到编译器的错误,可以选择第二个单选框Specify native compilers
手动选择编译器路径
2.3 编译配置
编译配置参考了网上几篇文章,普遍配置为:
ENABLE_PRECOMPILED_HEADERS:不勾选
WITH_IPP:不勾选
WITH_OPENGL:勾选
其中,ENABLE_PRECOMPILED_HEADERS
和WITH_IPP
在这边的配置中默认没有勾选因此无需操作
其他文章普遍勾选了ENABLE_CXX11
,但这边找不到相关配置,因此忽略这一项
如果有安装QT,可以选择勾选WITH_QT
,目前环境没有安装QT,选择不勾选
另外,CMAKE_INSTALL_PREFIX
可以配置install路径, 这里将其配置为了刚刚新建的install文件夹,这个文件夹将放置最终的编译结果
注:更建议使用opencv加版本号的形式替代install文件夹, 如opencv-4.5.4文件夹, 这样可以兼容不同版本的库, 这里为了方便, 直接使用install文件夹
其他的配置根据需要或碰到的问题,再进一步具体调整即可
2.4 生成
点击Generate
,等待生成
这一步会下载相关的文件,由于网络环境的影响,可能会有部分文件下载失败报错(如opencv_videoio_ffmpeg.dll
等)
下载失败的文件可在build目录的日志文件CMakeDownloadLog.txt
查看,文件中写明了下载链接及需要放置的路径,自行找另外的方法下载
这里提供了部分自己下载的文件,取出需要的文件放置到build/3rdparty对应位置即可
3rdparty_win.zip-蓝奏云
完成后再次点击Generate
2.5 Make编译和安装
打开cmd,使用cd命令进入build目录输入:
mingw32-make
如需要加速编译则输入
mingw32-make -j 8
其中-j 8
参数用于加速编译,数量8根据CPU核心决定
编译完成后,输入命令完成最后的安装步骤:
mingw32-make install
如果配置了CMAKE_INSTALL_PREFIX
, 那么OpenCV将会安装在指定的位置, 比如我这里设置了install文件夹, 记住install文件夹的位置, 后面调用该库时需要用到
此处没有对环境变量进行配置, 会导致编译时找不到源文件, 运行时也找不到动态链接库
先通过测试例程进行问题说明, 再针对问题配置环境
3.配置CMake编译环境
编译好OpenCV库后, 如果没有配置环境, 则系统将找不到库导致编译报错和运行报错;
下面是两种配置方法, 各有优劣:
- 将OpenCV配置到系统环境变量中, 这样所有用到OpenCV的工程都将引用该库
- 优点: 简单, 只需配置一次即可
- 在配置工程时指定OpenCV的路径,
- 优点: 不同的工程可以灵活指定不同的OpenCV库
3.1 CMAKE_PREFIX_PATH配置
这里我们仅介绍配置CMAKE_PREFIX_PATH
环境变量的方法, 来使得CMake可以查找倒OpenCV库:
- 打开windows环境变量设置界面(此电脑右键-属性-高级系统设置-环境变量)
- 找到环境变量
CMAKE_PREFIX_PATH
, 找不到则新建 - 将安装目录下的
x64\mingw\lib
加入到环境变量CMAKE_PREFIX_PATH
中- 这里我的安装路径是
F:\Project\OpenCV_Src\install
- 我的环境是x64, 编译器是mingw
- 因此最终要设置到环境变量中的值为:
F:\Project\OpenCV_Src\install\x64\mingw\lib;
- 注:这里最后带个分号可以使系统识别为列表, 方便添加其他CMake库或其他版本的OpenCV库
- 这里我的安装路径是
3.2 在CMake中引用
要在工程中调用OpenCV, 则需要在CMakeLists.txt中加入以下两个语句, 分别用于查找和链接:
find_package(OpenCV REQUIRED)
target_link_libraries(opencv_example PRIVATE ${OpenCV_LIBS})
如果需要指定OpenCV的版本, 则可以加入版本号, 如:
find_package(OpenCV 4.5.4 REQUIRED)
3.3 dll动态链接引用
执行调用了opencv的应用程序时, 可能会因为引用了dll动态链接库, 但系统找不到文件而报错
动态链接库文件位于install目录下的x64\mingw\bin
文件夹, 例如我的路径是: F:\Project\OpenCV_Src\install\x64\mingw\bin
因此有两种方法:
方法一: 加入PATH环境变量
- 点击PATH环境变量, 然后点编辑, 再点新建
- 将上述bin路径加入到PATH环境变量中
- 注意不要动到其他路径, 否则系统可能会出问题
方法二: 直接复制.dll到当前可执行文件所在文件夹
- 找到正确的bin文件夹, 也就是上述.dll所在文件夹
- 将所需的.dll文件复制到可执行文件(.exe)同目录下
- 更建议此方法, 反正要将该程序发给别人的话, 也得打包.dll文件, 否则别人也会报此错误
4.测试例程
4.1 代码
在任意位置新建一空文件夹作为测试用的工程, 并编写main.cpp
和CMakeLists.txt
文件:
main.cpp: 显示一张纯蓝色的200*200的图片
#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{cout << "Built with OpenCV " << CV_VERSION << endl;Mat img = Mat(200, 200, CV_8UC3, Scalar(255, 0, 0));imshow("Source", img);waitKey(0);return 0;
}
CMakeLists.txt: 将main.cpp加入工程; 然后查找并链接opencv库
# cmake needs this line
cmake_minimum_required(VERSION 3.1)# Define project name
project(opencv_example_project)# Find OpenCV, you may need to set OpenCV_DIR variable
# to the absolute path to the directory containing OpenCVConfig.cmake file
# via the command line or GUI
find_package(OpenCV REQUIRED)# If the package has been found, several variables will
# be set, you can find the full list with descriptions
# in the OpenCVConfig.cmake file.
# Print some message showing some of them
message(STATUS "OpenCV library status:")
message(STATUS " config: ${OpenCV_DIR}")
message(STATUS " version: ${OpenCV_VERSION}")
message(STATUS " libraries: ${OpenCV_LIBS}")
message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")# Declare the executable target built from your sources
add_executable(opencv_example main.cpp)# Link your application with OpenCV libraries
target_link_libraries(opencv_example PRIVATE ${OpenCV_LIBS})
# target_link_libraries(opencv_example PRIVATE strmiids)
# target_link_libraries(opencv_example PRIVATE quartz)
4.2 CMake配置和编译
4.2.1 配置
打开CMake GUI, 源文件位置: 选择当前文件夹, 编译位置: 选择当前文件夹下新建的build文件夹
点击Configure按钮, 在弹出的对话框中选择MinGW编译器, 操作与## 2.2 CMake-GUI相同, 可跳回去参考
点Finish, 将提示以下信息, 表示配置成功:
Found OpenCV: F:/Project/OpenCV_Src/install (found version "4.5.4")
OpenCV library status:
config: F:/Project/OpenCV_Src/install/x64/mingw/lib
version: 4.5.4
libraries: opencv_calib3d;opencv_core;opencv_dnn;opencv_features2d;opencv_flann;opencv_gapi;opencv_highgui;opencv_imgcodecs;opencv_imgproc;opencv_ml;opencv_objdetect;opencv_photo;opencv_stitching;opencv_video;opencv_videoio
include path: F:/Project/OpenCV_Src/install/include
Configuring done
和上述编译OpenCV源码的操作相似, 再点击Generate即可生成Makefile工程到build文件夹, 提示:
Generating done
编译报错:找不到OpenCV
报错信息如下:
CMake Error at CMakeLists.txt:10 (find_package):
By not providing "FindOpenCV.cmake" in CMAKE_MODULE_PATH this project has
asked CMake to find a package configuration file provided by "OpenCV", but
CMake did not find one.Could not find a package configuration file provided by "OpenCV" with any
of the following names:OpenCVConfig.cmake opencv-config.cmake
Add the installation prefix of "OpenCV" to CMAKE_PREFIX_PATH or set
"OpenCV_DIR" to a directory containing one of the above files. If "OpenCV"
provides a separate development package or SDK, be sure it has been
installed.
意思是找不到opencv, 需要我们在环境变量或配置中提供OpenCV库所在的位置, 参考## 3.1 CMAKE_PREFIX_PATH配置 进行环境配置, 并重启CMakeGUI以刷新程序的环境变量
4.2.2 编译
打开命令行工具, 并cd到build文件夹下, 然后执行make: mingw32-make
, 输出如下:
F:\Project\OpenCV_Src\project\test\build>mingw32-make
[ 50%] Building CXX object CMakeFiles/opencv_example.dir/main.cpp.obj
[100%] Linking CXX executable opencv_example.exe
[100%] Built target opencv_example
表示编译成功
4.2.3 运行
随后在build文件夹中, 双击运行程序: opencv_example.exe
如果操作无误, 则可以看到显示如下:
运行报错:找不到dll
如果弹出如下错误:
说明系统找不到.dll动态链接库文件, 参考: dll动态链接引用
运行exe, 看看是否还会报错, 将新报错的文件补上, 直到程序正常运行(或者简单粗暴一点, 将所有dll复制过去就完事), 针对例程程序的需要, 此处我复制了四个文件:
- libopencv_imgproc454.dll
- libopencv_core454.dll
- libopencv_highgui454.dll
- libopencv_imgcodecs454.dll