【问题标题】:Cant' build OpenCV 3.2.0 (Mingw32)无法构建 OpenCV 3.2.0 (Mingw32)
【发布时间】:2017-05-10 00:41:10
【问题描述】:

我知道...另一个这个...但是没有其他人的错误与我的相同,并且我已经尝试使用 mingw32 构建 opencv 好几天了。

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

我已经尝试了几个教程,但没有一个可以干净地工作,这是我能得到的最好的东西。

我做了什么:

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

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

【问题讨论】:

  • 不要附加为截图。以文本形式给出错误。
  • 看来是google测试的问题。 [1][2]

标签: opencv cmake mingw32


【解决方案1】:

原来 ou gTest 出于某种原因没有在 Mingw 中编译。 因为我不打算测试我的代码(暂时),所以我从安装中删除了opencv_ts(通过在配置之后和生成之前在 Cmake 中取消选择它)。

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

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

【讨论】:

    【解决方案2】:

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

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

    该修复基本上通过以下方式将 modules/ts/include/opencv2/ts/ts_gtest.h 中的 MingW 编译器的“_RTL_CRITICAL_SECTION”替换为“_CRITICAL_SECTION”: 线条

    // 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_;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-09
      • 2013-11-29
      • 2020-12-04
      • 2019-07-07
      • 2017-11-26
      • 2018-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多