文章目录
MinGW与MVSC编译的库文件无法共用!!!!!!!!!!!!
如果你急需编译opencv代码,我建议直接选用Visual Studio(MVSC)+opencv,整个编译过程非常简单,基本上没什么错误。
1、https://blog.youkuaiyun.com/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什么含义可以参考下面这个链接。建议和我保持一致。
(2、MinGW官网中github下载
w64devkit
这个GitHub链接,可以在https://www.mingw-w64.org/downloads/里找到,我建议你不要选择最新的版本,可以选择11.2这个版本的MinGW。可以下载这个。
(二)、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’。
二、安装过程
在安装之前,我建议你先开个代理
,出现的问题会比较少。
我opencv文件,目录结构如下:
(一)、第一次配置过程
打开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脚本自动完成上面的过程。
在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 -Og”,根据这个链接,我感觉-Og更好
。
然后重新make。发现也不会出现too file big错误,最终我选择-Og命令。如果你使用-O1,不用更换,其实没有太大的影响。
四、环境变量与opencv demo
(一)、opencv环境变量
首先我们新建一个系统变量名字这里我叫做OPENCV_INSTALL_NAME,这样以后比较容易切换opencv的版本,注意变量值中的斜杠是“/”
斜杠是“/”
斜杠是“/”
,不要"\",使用这个会有bug。当然我也试过mklink的方法,但是有些问题。
然后在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"
五、总结
写了快一天,懂得都懂。这些东西我都已经配置好了,但是想到有的人可能需要一个新的、比较好的教程,我自己又重新梳理一遍。也把各种问题,搜索了一遍。你都看到这里了,这样还不得来个一键三连
吗~~~~~~~~