不能构建OpenCV 3.2.0(Mingw32)

时间:2016-12-24 19:13:14

标签: opencv cmake mingw32

我知道......另一个......但没有其他人的错误与我的相同,我一直在尝试用mingw32构建opencv几天。

使用mingw构建OpenCV时,命令mingw32-make在某些时候尝试编译sources\modules\ts\src\ts_gtest.cpp失败,错误图片如下:

mingw32-make compile error

我已经尝试过几个教程,但没有一个干净利落,这是我能用的最好的工作。

我做了什么:

  • 安装了Mingw并将C:\Mingw\bin\添加到PATH环境变量。
  • 已安装CMake并将其添加到PATH。
  • 将OpenCV提取到C:\并创建forlder C:\opencv\mingwBuild\
  • 在CMake-GUI中,我将源文件夹定义为C:\opencv\sources\,并将文件夹构建为C:\opencv\mingwBuild\
  • 点击配置并选择Mingw Makefiles,使用'使用默认本机编译器'(还明确指定了编译器,结果相同。)。
  • 点击Generate,创建Makefile。
  • 我打开C:\Mingw\msys\1.0\msys.bat以获得一个加载了所有变量的控制台(直接从一个简单的cmd.exe尝试,假设为mingw设置了PATH,但我在编译时遇到同样的错误)。导航至C:\opencv\mingwBuild\并运行mingw32-make

这就是错误在一段时间后出现的地方。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

由于某种原因,明天你没有编译。 由于我不打算测试我的代码(目前),我从安装中删除了opencv_ts(通过在配置之后和生成之前在Cmake中取消选择它)。

有人提到,在@Dan Masek提到的第一个link中,GTest在mingw下有类型转换这个问题。他们说您可以根据错误消息编辑ts_gtest.cpp以应用正确的转化。如果您需要这个模块,这可能是一个解决方案。

@Dan Masek的第二个link中的另一个评论提到gcc的第5版超越了第4版的问题。因此,获得此类发行版也可能是一种解决方案。

答案 1 :(得分:-1)

对我而言,似乎可以通过应用此修复程序来修复:https://github.com/msk-repo01/opencv/commit/9a1835ce6676836ce278d723da4ff55a8f900ff1

(另见:https://github.com/opencv/opencv/issues/8105

修复基本上取代了" _RTL_CRITICAL_SECTION" by" _CRITICAL_SECTION"对于modules / ts / include / opencv2 / ts / ts_gtest.h中的MingW编译器,采用以下方式: 行

// assuming CRITICAL_SECTION is a typedef of _RTL_CRITICAL_SECTION.
// This assumption is verified by
// WindowsTypesTest.CRITICAL_SECTIONIs_RTL_CRITICAL_SECTION.
struct _RTL_CRITICAL_SECTION;

(从2016年12月开始,OpenCV 3.2.0版本中的第723行)被

取代
# if GTEST_OS_WINDOWS_MINGW
   // MinGW defined _CRITICAL_SECTION and _RTL_CRITICAL_SECTION as two
   // separate (equivalent) structs, instead of using typedef
   typedef struct _CRITICAL_SECTION GTEST_CRITICAL_SECTION;
# else
   // assuming CRITICAL_SECTION is a typedef of _RTL_CRITICAL_SECTION.
   // This assumption is verified by
   // WindowsTypesTest.CRITICAL_SECTIONIs_RTL_CRITICAL_SECTION.
   typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
# endif

_RTL_CRITICAL_SECTION* critical_section_;

替换为

GTEST_CRITICAL_SECTION* critical_section_;