使用Cmake和MinGW编译OpenCV 2.4.13

时间:2016-09-13 02:21:06

标签: c++ opencv build cmake mingw

我在尝试使用Cmake和mingw编译opencv时遇到了这个问题。

代表Cmake:   源代码位于“C:\ CPP Libraries \ OpenCV-2.4.13 \ opencv \ sources”中   要构建goint的二进制文件位于:“C:/ CPP Libraries / OpenCV-2.4.13 / opencv / build / x64 / mingw”

我已经使用Cmake来生成makefile。

当我运行makefile时:

C:\CPP Libraries\OpenCV-2.4.13\opencv\build\x64\mingw>mingw32-make

这是我在31%之后获得的输出

[ 31%] Building CXX object modules/highgui/CMakeFiles/opencv_highgui.dir/src/window_w32.cpp.obj
C:\CPP Libraries\OpenCV-2.4.13\opencv\sources\modules\highgui\src\window_w32.cpp: In function 'int icvCreateTrackbar(const char*, const char*, int*, int, CvTrackbarCallback, CvTrackbarCallback2, void*)':
C:\CPP Libraries\OpenCV-2.4.13\opencv\sources\modules\highgui\src\window_w32.cpp:1853:81: error: 'BTNS_AUTOSIZE' was not declared in this scope
                                         WS_CHILD | CCS_TOP | TBSTYLE_WRAPABLE | BTNS_AUTOSIZE | BTNS_BUTTON,
                                                                                 ^
C:\CPP Libraries\OpenCV-2.4.13\opencv\sources\modules\highgui\src\window_w32.cpp:1853:97: error: 'BTNS_BUTTON' was not declared in this scope
                                         WS_CHILD | CCS_TOP | TBSTYLE_WRAPABLE | BTNS_AUTOSIZE | BTNS_BUTTON,
                                                                                                 ^
modules\highgui\CMakeFiles\opencv_highgui.dir\build.make:187: recipe for target 'modules/highgui/CMakeFiles/opencv_highgui.dir/src/window_w32.cpp.obj' failed
mingw32-make[2]: *** [modules/highgui/CMakeFiles/opencv_highgui.dir/src/window_w32.cpp.obj] Error 1
CMakeFiles\Makefile2:2203: recipe for target 'modules/highgui/CMakeFiles/opencv_highgui.dir/all' failed
mingw32-make[1]: *** [modules/highgui/CMakeFiles/opencv_highgui.dir/all] Error 2
Makefile:159: recipe for target 'all' failed
mingw32-make: *** [all] Error 2

有没有人知道解决方案,因为我对这个没有任何线索。

// EDIT!

从git存储库下载版本并尝试构建它后,我遇到了其他错误。 我已经尝试将#define _WIN32_IE 0x0300更改为#define _WIN32_IE 0x0500 在MinGW目录中的“commctrl.h”中,但它没有工作。

C:\CPP Libraries\OpenCV-2.4.13\Git\opencv\build\x64\mingw>mingw32-make
[  2%] Built target zlib
[  6%] Built target libtiff
[ 11%] Built target libjpeg
[ 16%] Built target libwebp
[ 19%] Built target libjasper
[ 20%] Built target libpng
[ 26%] Built target IlmImf
[ 26%] Built target opencv_core_pch_dephelp
[ 26%] Built target pch_Generate_opencv_core
[ 26%] Building CXX object modules/core/CMakeFiles/opencv_core.dir/src/parallel.cpp.obj
C:\CPP Libraries\OpenCV-2.4.13\Git\opencv\modules\core\src\parallel.cpp: In function 'int cv::getThreadNum()':
C:\CPP Libraries\OpenCV-2.4.13\Git\opencv\modules\core\src\parallel.cpp:474:45: error: 'pthread_self' was not declared in this scope
     return (int)(size_t)(void*)pthread_self(); // no zero-based indexing
                                             ^
modules\core\CMakeFiles\opencv_core.dir\build.make:990: recipe for target 'modules/core/CMakeFiles/opencv_core.dir/src/parallel.cpp.obj' failed
mingw32-make[2]: *** [modules/core/CMakeFiles/opencv_core.dir/src/parallel.cpp.obj] Error 1
CMakeFiles\Makefile2:1473: recipe for target 'modules/core/CMakeFiles/opencv_core.dir/all' failed
mingw32-make[1]: *** [modules/core/CMakeFiles/opencv_core.dir/all] Error 2
Makefile:159: recipe for target 'all' failed
mingw32-make: *** [all] Error 2

6 个答案:

答案 0 :(得分:3)

问题(根据Artur Wieczorek)是MinGW默认设置的操作系统版本。为了治愈它找到" commctrl.h"在MinGW目录和类似

 #if 0
 #define _WIN32_IE   0x0300
 #endif

然后将其更改为

 #if 1
 #define _WIN32_IE   0x0500
 #endif

答案 1 :(得分:1)

展开Le Quyen's回答:

不需要“git版本”。

2.4.13的error: 'BTNS_AUTOSIZE' was not declared in this scopehttp://code.opencv.org/issues/4087中解决:

  1. 打开C:\MingW\include\commctrl.h或等效。
  2. 搜索/* define _WIN32_IE if you really want it */
  3. 编辑下方的文字,如下所示:

    #if 1
    #define _WIN32_IE   0x0500
    #endif
    
  4. 为Artur Wieczoek和Vit Shiryaev提供了暗示。

    为什么不设置?我不知道但是给你MingW的人正在尝试to make this clear on their wiki

      

    在包含windows.h头文件之前,需要将_WIN32_WINDOWS,_WIN32_WINNT,WINVER和/或_WIN32_IE定义到您计划支持的最小平台。可以在头文件w32api.h中找到这些定义的可能值。

答案 2 :(得分:0)

我正在尝试使用Android的非自由模块编译OpenCV 3.1,我收到了消息

error: 'pthread_self' was not declared in this scope

通过包含" ANDROID_NDK_LAYOUT"解决了这个问题。有价值的" RELEASE"。

我的CMake配置: CMake configuration

我做了一个" mingw32-make clean" (以防万一)和" mingw32-make"

答案 3 :(得分:0)

我有完全相同的问题,所以这个问题实际上是有效的,这让我想知道为什么它被投票。

我在windows10上。经过多次尝试,我通过简单地下载openCV-3.1.0而不是2.4.13来解决这个问题。

在转向openCV-3.1.0之前,我尝试单独安装code :: blocks,然后安装最新的mingw版本。没有帮助。我也尝试使用32位版本的CMake和64位版本生成makefile。也没帮助。

使用opencCV-3.1.0,您无需编辑任何.h文件,就像我在别处阅读一样。期望更长的mingw32-make执行时间。

答案 4 :(得分:0)

我通过在CMake中取消选中pthread_self解决了WITH_PTHREADS_PF错误

答案 5 :(得分:0)

我也得到了像

这样的东西
  

" opencv / sources / module / core / src / parallel.cpp":在函数" int   CV :: getThreadNum()" ....... / parallel.cpp:505:45:错误:' pthread'是   未在范围内声明

我尝试了上述建议将Mingw / include / commctrl.h更改为:

#ifndef _WIN32_IE
/* define _WIN32_IE if you really want it */
#if 0                           // to 1
#define _WIN32_IE   0x0300      // to 0x0500
#endif
#endif

但事情并没有继续下去,我仍然遇到同样的问题。

然后我取消选中" WITH_PTHREADS_PF"在CMake-GUI标志列表中继续进行。