windows

时间:2017-01-30 06:48:54

标签: opencv mingw mingw-w64

在Windows 10平台上使用mingw32-make命令进行opencv安装,然后可能最终得到以下错误。

Windows版本:10 OPENCV:3.2.0

请建议我安装。

D:\installers\opencv\sources\modules\ts\src\ts_gtest.cpp: In constructor 'testing::internal::Mutex::Mutex()':
D:\installers\opencv\sources\modules\ts\src\ts_gtest.cpp:8829:45: error: cannot convert 'CRITICAL_SECTION* {aka _CRITICAL_SECTION*}' to '_RTL_CRITICAL_SECTION*' in initialization
       critical_section_(new CRITICAL_SECTION) {
                                             ^
D:\installers\opencv\sources\modules\ts\src\ts_gtest.cpp:8830:48: error: cannot convert '_RTL_CRITICAL_SECTION*' to 'LPCRITICAL_SECTION {aka _CRITICAL_SECTION*}' for argument '1' to 'void InitializeCriticalSection(LPCRITICAL_SECTION)'
   ::InitializeCriticalSection(critical_section_);
                                                ^
D:\installers\opencv\sources\modules\ts\src\ts_gtest.cpp: In destructor 'testing::internal::Mutex::~Mutex()':
D:\installers\opencv\sources\modules\ts\src\ts_gtest.cpp:8840:46: error: cannot convert '_RTL_CRITICAL_SECTION*' to 'PCRITICAL_SECTION {aka _CRITICAL_SECTION*}' for argument '1' to 'void DeleteCriticalSection(PCRITICAL_SECTION)'
     ::DeleteCriticalSection(critical_section_);
                                              ^
D:\installers\opencv\sources\modules\ts\src\ts_gtest.cpp: In member function 'void testing::internal::Mutex::Lock()':
D:\installers\opencv\sources\modules\ts\src\ts_gtest.cpp:8848:43: error: cannot convert '_RTL_CRITICAL_SECTION*' to 'LPCRITICAL_SECTION {aka _CRITICAL_SECTION*}' for argument '1' to 'void EnterCriticalSection(LPCRITICAL_SECTION)'
   ::EnterCriticalSection(critical_section_);
                                           ^
D:\installers\opencv\sources\modules\ts\src\ts_gtest.cpp: In member function 'void testing::internal::Mutex::Unlock()':
D:\installers\opencv\sources\modules\ts\src\ts_gtest.cpp:8858:43: error: cannot convert '_RTL_CRITICAL_SECTION*' to 'LPCRITICAL_SECTION {aka _CRITICAL_SECTION*}' for argument '1' to 'void LeaveCriticalSection(LPCRITICAL_SECTION)'
   ::LeaveCriticalSection(critical_section_);
                                           ^
D:\installers\opencv\sources\modules\ts\src\ts_gtest.cpp: In member function 'void testing::internal::Mutex::ThreadSafeLazyInit()':
D:\installers\opencv\sources\modules\ts\src\ts_gtest.cpp:8879:27: error: cannot convert 'CRITICAL_SECTION* {aka _CRITICAL_SECTION*}' to '_RTL_CRITICAL_SECTION*' in assignment
         critical_section_ = new CRITICAL_SECTION;
                           ^
D:\installers\opencv\sources\modules\ts\src\ts_gtest.cpp:8880:54: error: cannot convert '_RTL_CRITICAL_SECTION*' to 'LPCRITICAL_SECTION {aka _CRITICAL_SECTION*}' for argument '1' to 'void InitializeCriticalSection(LPCRITICAL_SECTION)'
         ::InitializeCriticalSection(critical_section_);
                                                      ^
modules\ts\CMakeFiles\opencv_ts.dir\build.make:237: recipe for target 'modules/ts/CMakeFiles/opencv_ts.dir/src/ts_gtest.cpp.obj' failed
mingw32-make[2]: *** [modules/ts/CMakeFiles/opencv_ts.dir/src/ts_gtest.cpp.obj] Error 1
CMakeFiles\Makefile2:5379: recipe for target 'modules/ts/CMakeFiles/opencv_ts.dir/all' failed
mingw32-make[1]: *** [modules/ts/CMakeFiles/opencv_ts.dir/all] Error 2
Makefile:159: recipe for target 'all' failed
mingw32-make: *** [all] Error 2

2 个答案:

答案 0 :(得分:8)

在使用 Windows10 上的 mingw32 尝试构建 OpenCV 3.2.0 时,我也遇到了同样的问题。为了类似的问题,我搜索了一下a fix on Github。它说问题是:

  

MinGW将_CRITICAL_SECTION和_RTL_CRITICAL_SECTION定义为两个独立(等效)的结构,而不是使用typedef

因此,您必须为_CRITICAL_SECTION和_RTL_CRITICAL_SECTION添加另一个typedef GTEST_CRITICAL_SECTION,并在任何一种情况下使用此typedef。

以下是该怎么做:

编辑&#34; ts_gtest.h&#34; ,它位于&#34; opencv \ sources \ modules \ ts \ include \ opencv2 \ ts \&#34; < /强>

  1. 更换此行(可能是第723行)
  2. 
    
        // 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;
    
    
    

    
    
        #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
            // Assume 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
    
    
    
    1. 替换此行(可能在编辑之前在第3060行 - 在修改第一部分时更改行号)
    2. 
      
          _RTL_CRITICAL_SECTION* critical_section_;
      
      
      

      
      
          GTEST_CRITICAL_SECTION* critical_section_;
      
      
      

      这两项更改应解决您的上述错误。

答案 1 :(得分:0)

使用TDM-gcc mingw编译器修复了它。