windows+Cmake+MinGW+编译opencv4.5 sources安装过程以及opencv踩坑日记


MinGW与MVSC编译的库文件无法共用!!!!!!!!!!!!
如果你急需编译opencv代码,我建议直接选用Visual Studio(MVSC)+opencv,整个编译过程非常简单,基本上没什么错误。
1、https://blog.csdn.net/excelNo1/article/details/118142075
2、https://zhuanlan.zhihu.com/p/344036896


我电脑配置
1、windows10家庭版系统版本号1909
2、CPU i7-13700KF(影响编译时长)
3、MinGW(GCC) 11.2(x86_64-11.2.0-release-posix-seh-rt_v9-rev0.7z)— MinGW8.1也没有问题
4、Cmake 3.27.2
5、opencv4.5.5(PS: 我下载了4.6和4.8版本opencv,都是遇到类似问题,基本上这个篇教程就能把问题给解决了),所以在这个教程你可能会看到opencv4.8的字样,建议直接忽略,将其当作4.5。什么叫做指4.8为4.5—(指鹿为马)
6、Time:2023.8.20

前言

最近在win10平台使用MinGW(GCC)编译opencv sources遇到各种问题,花费了好长时间。在这里对一些问题进行汇总,加上自己对问题的一些思考,提出一些解决方案。


一、MinGW(GCC)+Cmake+opencv source下载

(一)、MinGW(GCC)安装

在这里我贴两个MinGW下载地址,具体安装教程可以自行百度。这里没有什么难点。我推荐第二个方法下载MinGW,即MinGW11.2的版本。

(1、sourceforge

sourceforge网站下载MinGW
注意在这个网址下载MinGW,我建议你直接把网页拉到最下面下载MinGW8.1。不要点击Online Installer,这个在线安装好像会卡死,无法下载。我们可以选用x86_64_posix-seh,如果你想了解posix,seh,win32,sjlj什么含义可以参考下面这个链接。建议和我保持一致。
sourceforge MinGW8.1

(2、MinGW官网中github下载

w64devkit
这个GitHub链接,可以在https://www.mingw-w64.org/downloads/里找到,我建议你不要选择最新的版本,可以选择11.2这个版本的MinGW。可以下载这个。
x86_64_posix_seh-rt_v9

(二)、Cmake

这个下载没啥好说的,自行百度。

(三)、Opencv sources

opencv github release地址
不要下载"1 opencv-4.8.0-windows.exe",这个是基于MSVC(visual studio)编译opencv代码,下载"2、source code"。
注意:MSVC与MinGW编译的库文件不能共用!!!!!
注意:MSVC与MinGW编译的库文件不能共用!!!!!
注意:MSVC与MinGW编译的库文件不能共用!!!!!
如果使用了,编译一个具体opencv项目时可能会报以下错误:
E:*******: error: undefined reference to `__imp__ZN7mysqlpp10ConnectionC1Eb’。

windows.exe与source code

二、安装过程

在安装之前,我建议你先开个代理,出现的问题会比较少。

我opencv文件,目录结构如下:
opencv文件目录结构

(一)、第一次配置过程

打开Cmake-GUI

Cmake-gui添加文件夹
第一次configure,要选择MinGW Makefiles,如果你给MinGW配置了环境变量,直接选择第一次按钮就可以,然后点击Finish。
在这里插入图片描述

在第一次Configure过程中你可能出现可能产生的警告与问题:
1、在点击Configure以后,Cmake配置完成一般花费3分钟左右,如果你等了很长时间我建议你往下面看,很有可能是无法下载opencv_videoio_ffmpeg.dll和opencv_videoio_ffmpeg_64.dll两个文件
无法下载opencv_videoio_ffmpeg.dll和opencv_videoio_ffmpeg_64.dll解决方案

2、关于python一些警告

你可以在问题汇总中查看解决方法。

(二)、第二次配置过程

在第一次Configure之后,这里会出现一些按钮,然后变红。每次configure新添加一些Entry就会变红,变红是正常现象,不要在意。
在这里插入图片描述

(1、首先我们Search里指定安装目录(install)

在这里插入图片描述

(2、然后添加opencv_contrib模块,注意路径以modules结尾

注意你要是添加opencv_contrib模块,如果出现一堆下载问题的话,你可以参考下载问题解决方法

在这里插入图片描述
可能存在问题
xfeatures2d/vgg: Download: vgg_generated_80.i 下载时间太长 或者失败或者出现data: Download failed: 35;"SSL connect error"错误。
xfeatures2d/vgg: Download: vgg_generated_120.i下载时间太长或者失败或者出现data: Download failed: 35;"SSL connect error"错误。
data: Download: face_landmark_model.dat 下载时间太长或者失败或者出现data: Download failed: 35;"SSL connect error"错误"
在这里插入图片描述

(3、BUILD_opencv_world

这个按钮可以点,也可以不点。不点的话出现的问题比较少,但是产生的dll文件比较多。点了话,以后产生dll文件比较少,出现问题比较多。这里咱们点上,走最难路,让路无处可走。
在这里插入图片描述

(4、CMAKE_BUILD_TYPE选择opencv本次编译的版本(Release、Debug)

大部分教程编译Release版本dll库就不管了,但是有时候我们会用到Debug版本dll库文件。在这里我先们先编译Release版本opencv dll库文件,然后在编译Debug版本opencv dll库文件。
在这里插入图片描述

完成上面的配置以后,我们再次点击Configure,如果你是天选之人,这次控制台没有显示任何错误,会有一些无关紧要警告。然后可以点击Generate按钮,会产生蓝框区域的信息。如果有错误,先把错误解决了,在依次点击Configure、Generate按钮。
在这里插入图片描述

(5、点击configre以后可能存在问题

1、opencv 某些文件下载时间或者失败或者出现data: Download failed: 35;"SSL connect error"错误。

xfeatures2d/vgg: Download: vgg_generated_80.i 下载时间太长 或者失败或者出现data: Download failed: 35;"SSL connect error"错误。
xfeatures2d/vgg: Download: vgg_generated_120.i下载时间太长或者失败或者出现data: Download failed: 35;"SSL connect error"错误。
data: Download: face_landmark_model.dat 下载时间太长或者失败或者出现data: Download failed: 35;"SSL connect error"错误"

可以参考这个地方下载问题解决方法,强烈建议使用powershell方法解决问题。

(三)、Make阶段

(1、make -j15

在Make过程,首先我们以管理用户权限运行cmd,然后切换到mingw-build目录,随后使用make -j15(多线程make,-j后的数字取决你的cpu)指令。
一定要管理员权限运行cmd!!!!
一定要管理员权限运行cmd!!!!
一定要管理员权限运行cmd!!!!
之前没使用管理员权限会出现无法复制文件的错误。
在这里插入图片描述在这里插入图片描述

(2、make -j15以后可能存在的问题

1、在这里我们可能出现在building vs_version.rc.obj出现错误:
Building RC object modules/world/CMakeFiles/opencv_world.dir/vs_version.rc.obj出现错误
2、opencv出现libhdf5.lib的错误
opencv出现libhdf5.lib的错误

(3、make install

然后使用make install命令,然后编译的文件会保存在这里
在这里插入图片描述

(4、编译Deubg版本库文件(libopencv_world455d.dll.a)

查看我们编译好的lib文件,可以看到我们只有Release版本的libopencv_world455.dll.a文件,现在我们编译Debug版本lib文件,即产生libopencv_world455d.dll.a文件。
在这里插入图片描述
我需要在CMAKE_BUILD_TYPE设置Debug

在这里插入图片描述
然后将CMAKE_CXX_FLAGS_DEBUG设置-g -O1或者选用-g -Og。注意是字母O不是数字0
在这里插入图片描述

然后点击Configure,Generate按钮。使用make -j15,make install重新生成编译文件。

成功安装以后,会出现libopencv_world455d.dll.a文件
在这里插入图片描述

(5、编译Deubg版本库文件 可能存在问题:

1、linking libopencv_world455d.dll 花费非常长的时间

在linking libopencv_world455d.dll过程中,会花费非常长的时间,我感觉得有15分钟(取决你的于Cpu),没有好的方法等着吧。

[ 19%] Linking CXX shared library …\bin\libopencv_world455d.dll
在这里插入图片描述

2、file too big Error

Fatal error: can’t write 9 bytes to section .text$ZNSt14numeric_limitsIfE9quiet_NaNEv of CMakeFiles\opencv_perf_core.dir_\core\perf\opencl\perf_arithm.cpp.obj: ‘file too big’

C:\Users???\AppData\Local\Temp\cce8Whz6.s: Fatal error: CMakeFiles\opencv_perf_core.dir__\core\perf\opencl\perf_arithm.cpp.obj: file too big

perf_arithm.cpp.obj: file too big解决方法
在这里插入图片描述

三、问题汇总

1)、关于python一些警告:

python warning

点击configure以后可能产生CMake’s ‘find_host_package(PythonInterp 2.7)’ found wrong Python version和 Policy CMP0148 is not set: The FindPythonInterp and FindPythonLibs modules
are removed.警告,如下图两张图所示,这些警告可以忽略,不影响最后生成结果,但是我建议你和有一样的步骤。
在这里插入图片描述
在这里插入图片描述
我不太需要python+opencv,理论上opencv在python直接pip安装就好了,安装又快更换版本又简单。所以可以search上搜索python,把前三个对号去掉就可以了。去掉以后再次点击configure按钮即可。
在这里插入图片描述

2)、FFMPEG: Download: opencv_videoio_ffmpeg.dll和FFMPEG: Download: opencv_videoio_ffmpeg_64.dll下载失败或者下载时间过长

如果你遇到下载问题,都可以用下面两个方法来解决,我建议使用第二个powershell方法解决下载问题
问题:FFMPEG: Download: opencv_videoio_ffmpeg.dll和FFMPEG: Download: opencv_videoio_ffmpeg_64.dll, 在下载ffmpeg和ffmpeg_64的时候花费较长的时间,或者直接下载失败。这个问题在第一次点击configure,一般都会出现,如果你出现了,我建议你直接点击Stop,继续等待也是浪费时间。点击Stop以后,Configure停止会花费一定时间,大概在3分钟左右,然后会报错。当然你也可以直接把Cmake-GUI的窗口直接关了,跳过等待时间。
在这里插入图片描述

1、第一种方法:手动下载

解决方法思路很简单,我们把需要下载的文件提前下载好就可以了。我这里以下载:opencv_videoio_ffmpeg.dll文件举例。
注意下图,我标红1、位置,我去找到这个文件CMakeDownloadLog.txt,然后去下载所需的文件。我标红2、位置,显示的FFMPEG: Download: opencv_videoio_ffmpeg_64.dll,我截错图了,应该是FFMPEG: Download: opencv_videoio_ffmpeg.dll
在这里插入图片描述

打开CMakeDownloadLog.txt,寻找opencv_videoio_ffmpeg.dll,你可以看到。以下内容

在这里插入图片描述

1、位置代表我们保存本地路径,2、位置代表我们需要去下载的网络路径,这里的路径显示不全。
具体步骤:1、去指定网络路径(地址)去下载文件。2、然后将下载好的文件重命名,一定要与本地路径出现文件名保持一致。3、把重命名好的文件,放到本地路径中。我的本地路径是这样的,你可以看到0 kB那个文件,这个文件就是我们需要替换的ffmpeg.dll。
在这里插入图片描述

2、第二种方法:powershell脚本下载

当然还有另一个方法,直接省略以上繁琐的步骤,而且如果你添加opencv_contrib-4.5.5模块,也出现一堆下载错误一次一次重命名挺烦的:

在与CMakeDownloadLog.txt同路径下,出现两个sh脚本,download_with_curl.sh和download_with_wget.sh。注意:如果没有这两个脚本你就去CMakeDownloadLog.txt找下载网络路径和本地路径。以download_with_curl.sh为例,内容如下其实我们可以像"download_with_curl.sh" shell脚本一样,编写powershell脚本自动完成上面的过程。

curl.sh脚本

在powershell脚本中我们可以这样写。需要注意一点:$client.DownloadFile("网络路径","本地路径") 这与shell脚本刚好相反,并且你要打开代理,Github里东西下载比较慢。这个powershell脚本可以放在任意位置,我建议powershell窗口里运行,这样你写错了它会报错。
在这里插入图片描述
在这里插入图片描述
显示111111就代表下载成功了,你可以去sources/.cache/ffmpeg查看下载的文件。
在这里插入图片描述

$client = new-object System.Net.WebClient
$client.DownloadFile("网络路径1","本地路径1")
#$client.DownloadFile("网络路径2","本地路径2")  
#$client.DownloadFile("网络路径3","本地路径3")  
echo "1111111"

同理,如果无法FFMPEG: Download: opencv_videoio_ffmpeg_64.dll,重复上面步骤,找出网络路径与本地路径,然后在powershell脚本中添加一行$client.DownloadFile(“网络路径”,“本地路径”),就可以了。整个过程简洁省事。其实你在第一次configure的时候可以 ,可以尝试等待一段时间,有时候opencv_videoio_ffmpeg.dll 和opencv_videoio_ffmpeg_64.dll会在download_with_curl.sh或者在CMakeDownloadLog.txt中同时出现,一次操作就可以把所有的东西下载好。因为每次Stop其实会花费很长的时间,当然你可以选择关闭Cmake-GUI窗口。

3)、opencv出现libhdf5.lib的错误

在libhdf5.lib(CMakeFiles/hdf5-static.dir/H5EAtest.c.obj)出现错误

/anaconda3/Library/lib/libhdf5.lib(CMakeFiles/hdf5-static.dir/H5EAtest.c.obj)😦.xdata[ u n w i n d unwind unwindH5EA__test_debug]+0x10): undefined reference to `__GSHandlerCheck’

在这里插入图片描述

参考链接
把BUILD_opencv_hdf这个按钮关闭即可,我感觉这不是根本的解决方法,这可能需要我们重新编译一个MinGW+hdf5文件,将编译好的文件路径添加到两个entry中。简便起见,在这里我直接把BUILD_opencv_hdf这个按钮关闭,以后遇到什么问题在更新(2023.8.19)。把按钮关闭以后重新Configure,然后Generate,最后重新运行make -j15命令。
在这里插入图片描述

4)、Building RC object vs_version.rc.obj error

vs_version.rc.obj error

Building RC object modules/world/CMakeFiles/opencv_world.dir/vs_version.rc.obj出现错误
在这里插入图片描述
解决方法可以参考这个链接

"""
modules/world/CMakeFiles/opencv_world.dir/vs_version.rc.obj: modules/world/vs_version.rc
	@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=D:\studysoftware\A1sourceSoftware\Opencv\opencv-4.5.5-single\mingw-build\CMakeFiles --progress-num=$(CMAKE_PROGRESS_1041) "Building RC object modules/world/CMakeFiles/opencv_world.dir/vs_version.rc.obj"
	cd /d D:\studysoftware\A1sourceSoftware\Opencv\opencv-4.5.5-single\mingw-build\modules\world && 
	D:\studysoftware\A1sourceSoftware\MinGW\mingw64\bin\windres.exe -O coff $(RC_DEFINES) $(RC_INCLUDES) $(RC_FLAGS) D:\studysoftware\A1sourceSoftware\Opencv\opencv-4.5.5-single\mingw-build\modules\world\vs_version.rc CMakeFiles\opencv_world.dir\vs_version.rc.obj
"""
#这个代码是具体解决方法
cd /d D:\studysoftware\A1sourceSoftware\Opencv\opencv-4.5.5-single\mingw-build\modules\world && D:\studysoftware\A1sourceSoftware\MinGW\mingw64\bin\windres.exe -O coff $(RC_DEFINES) $(RC_INCLUDES) $(RC_FLAGS) D:\studysoftware\A1sourceSoftware\Opencv\opencv-4.5.5-single\mingw-build\modules\world\vs_version.rc CMakeFiles\opencv_world.dir\vs_version.rc.obj

下载完成以后,注意最后一个文件!!。
在这里插入图片描述

5)、opencv gapi_core_perf_tests_cpu.cpp.obj: file too big

file too big error
在这里插入图片描述
出现:error opencv gapi_core_perf_tests_cpu.cpp.obj: file too big,会报一个file too big的错误,我从网上查了查,发现和Cmake中CMAKE_CXX_FLAGS_DEBUG参数有关,可以参考
opencv error file too big
github doxygen issues
github opencv issues
如果你想理解-O参数可以参考这两个链接
gcc的优化参数介绍(-O1,-O2,-O3,-Os),
gcc/g++ 优化标识(C-FLAGS) -O/O1 -O2 -O3 -Os -Ofast -O0/Og

C++ flags(Release、Debug) -O级别不一样,默认情况下Release: -O3, Debug: -O0。可以将Debug -O的级别修改为-O1或者-Og就可以解决opencv出现too big file错误。

CMAKE_CXX_FLAGS_DEBUG:-g -O1

在这里插入图片描述
在这里插入图片描述

最后我也尝试CMAKE_CXX_FLAGS_DEBUG=“-g -Og”,根据这个链接我感觉-Og更好
然后重新make。发现也不会出现too file big错误,最终我选择-Og命令。如果你使用-O1,不用更换,其实没有太大的影响。

四、环境变量与opencv demo

(一)、opencv环境变量

为什么要配置opencv环境变量

首先我们新建一个系统变量名字这里我叫做OPENCV_INSTALL_NAME,这样以后比较容易切换opencv的版本,注意变量值中的斜杠是“/” 斜杠是“/” 斜杠是“/” ,不要"\",使用这个会有bug。当然我也试过mklink的方法,但是有些问题。
OPENCV_INSTALL_NAME环境变量
然后在Path添加两个搜索变量,这样环境变量就配置成功了。
在这里插入图片描述

%OPENCV_INSTALL_NAME%\include
%OPENCV_INSTALL_NAME%\x64\mingw\bin

以后我们更改opencv的版本直接更改OPENCV_INSTALL_NAME里的路径就可以了,Path中变量就不需要动了。

(二)、VScode+opencv demo

配置vscode比较复杂你可能需要Cmake等插件,这个自动百度吧。我使用VScode+Cmake+MinGW来构建一个demo项目。项目目录结构如下所示。
在这里插入图片描述

DisplayImage.cpp

#include <iostream> 
#include <opencv2/opencv.hpp> // 包含opencv的库头文件

using namespace std;
using namespace cv;  //使用命名空间cv,包含空间中方法及属性

int main(int argc, char** argv )
{
    int a=1;
    cout<<a;
    Mat z = Mat::ones(2,2,CV_32F);
    cout<<z<<endl;


    // if ( argc != 2 ) // 命令行参数个数不是2个的时候
    // {
    //     printf("use: DisplayImage <Image_Path>\n"); // 提示:按照固定格式输入指定内容!
    //     return -1;
    // }

    

    // Mat img; //创建一个名称为img的图像容器(这个后边会介绍到)
    // img = imread( argv[1], 1 ); //为该容器读取命令行中 DisplayImage 之后的参数(图片路径“<Image_Path>”)
    // if ( !img.data ) //如果读取数据为空(没有读取到图片)
    // {
    //     cout<<"没有图片数据!"<<endl;
    //     return -1;
    // }
    // namedWindow("检索到的图片", WINDOW_AUTOSIZE );//创建图片显示窗口
    // imshow("Display Image", img);//显示图片
    // waitKey(0); //延迟等待
    // return 0;
}

CMakeLists.txt文件

cmake_minimum_required(VERSION 2.8) # 选择最匹配的最低的Cmake版本
project( DisplayImage ) # 创建的程序的名称(项目的名称)

message(STATUS "HOME dir: $ENV{OPENCV_INSTALL_NAME}")
set(OpenCV_INCLUDE_DIRS "$ENV{OPENCV_INSTALL_NAME}/include")
file(GLOB_RECURSE OpenCV_LIBS "$ENV{OPENCV_INSTALL_NAME}/x64/mingw/lib/*.dll.a")
include_directories( ${OpenCV_INCLUDE_DIRS} ) # 添加一个用于包含的文件去构建的文件夹


message("-------------- start ------------------")
message("${OpenCV_INCLUDE_DIRS}")
message("${OpenCV_LIBRARY_DIRS}")
message("${OpenCV_LIBS}")

add_executable( DisplayImage DisplayImage.cpp ) # 添加参与编译的项目完整包
target_link_libraries( DisplayImage ${OpenCV_LIBS} ) # 链接的库

如果出现类似输出,那么你就安装成功了。
在这里插入图片描述
注意:在使用vscode期间,如果你更改了环境变量,并且这个项目里使用这个变量,我建议你重新打开Vscode然后把build文件删除,然后在cmake

在DisplayImage.cpp,你可以把我打得注释去掉,然后切换build文件夹下,使用以下命令显示一张图片!!!!

#切换到这个路径下:F:\Cplusplus\leetcode\leetcode\DeepLearn\opencv_test\build> 
.\DisplayImage.exe "E:\System\Pictures\556049.jpg"

五、总结

写了快一天,懂得都懂。这些东西我都已经配置好了,但是想到有的人可能需要一个新的、比较好的教程,我自己又重新梳理一遍。也把各种问题,搜索了一遍。你都看到这里了,这样还不得来个一键三连吗~~~~~~~~

在这里插入图片描述

  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值