使用Cmake和MinGW编译OpenCV 2.4.13

Compiling OpenCV 2.4.13 with Cmake and MinGW

本文关键字:OpenCV 编译 Cmake MinGW 使用      更新时间:2023-10-16

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

Cmake

:源代码位于"C:CPP Libraries opencv -2.4.13opencvsources"要构建的二进制文件位于:"C:/CPP Libraries/opencv -2.4.13/opencv/build/x64/mingw"

我已经使用Cmake生成了makefile.

当我运行makefile时:

C:CPP LibrariesOpenCV-2.4.13opencvbuildx64mingw>mingw32-make

这是31%

之后的输出
[ 31%] Building CXX object modules/highgui/CMakeFiles/opencv_highgui.dir/src/window_w32.cpp.obj
C:CPP LibrariesOpenCV-2.4.13opencvsourcesmoduleshighguisrcwindow_w32.cpp: In function 'int icvCreateTrackbar(const char*, const char*, int*, int, CvTrackbarCallback, CvTrackbarCallback2, void*)':
C:CPP LibrariesOpenCV-2.4.13opencvsourcesmoduleshighguisrcwindow_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 LibrariesOpenCV-2.4.13opencvsourcesmoduleshighguisrcwindow_w32.cpp:1853:97: error: 'BTNS_BUTTON' was not declared in this scope
                                         WS_CHILD | CCS_TOP | TBSTYLE_WRAPABLE | BTNS_AUTOSIZE | BTNS_BUTTON,
                                                                                                 ^
moduleshighguiCMakeFilesopencv_highgui.dirbuild.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
CMakeFilesMakefile2: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

有人知道解决办法吗?因为我对这个问题毫无头绪。

//编辑!

从git仓库下载版本并尝试构建它后,我得到了这些其他错误。我已经尝试将#define _WIN32_IE 0x0300更改为#define _WIN32_IE 0x0500在MinGW目录下的"commctrl.h"中,但是没有。

C:CPP LibrariesOpenCV-2.4.13Gitopencvbuildx64mingw>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 LibrariesOpenCV-2.4.13Gitopencvmodulescoresrcparallel.cpp: In function 'int cv::getThreadNum()':
C:CPP LibrariesOpenCV-2.4.13Gitopencvmodulescoresrcparallel.cpp:474:45: error: 'pthread_self' was not declared in this scope
     return (int)(size_t)(void*)pthread_self(); // no zero-based indexing
                                             ^
modulescoreCMakeFilesopencv_core.dirbuild.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
CMakeFilesMakefile2: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

问题(根据Artur Wieczorek)是MinGW默认设置的操作系统版本。要解决这个问题,请在MinGW目录中找到"commctrl.h",然后输入

 #if 0
 #define _WIN32_IE   0x0300
 #endif

然后改成

 #if 1
 #define _WIN32_IE   0x0500
 #endif

展开乐泉的回答:

不需要 " git版本"。

在http://code.opencv.org/issues/4087:

中绕过2.4.13的error: 'BTNS_AUTOSIZE' was not declared in this scope
    打开C:MingWincludecommctrl.h或等同物。
  1. search /* define _WIN32_IE if you really want it */
  2. 编辑下面的文本,使其看起来像这样:

    #if 1
    #define _WIN32_IE   0x0500
    #endif
    

感谢Artur Wieczoek和Vit Shiryaev的提示。


为什么设置?我不知道,但是那些给你MingW的人正试图在他们的维基上说清楚这一点:

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

我正试图用Android的非自由模块编译OpenCV 3.1,我得到了消息

error: 'pthread_self' was not declared in this scope

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

我的CMake配置:CMake配置

我创建了"mingw32-make clean"(以防万一)和"mingw32-make"

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

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

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

使用opencv -3.1.0,您不需要像我在其他地方读到的那样编辑任何.h文件。预计mingw32-make的执行时间也会更长。

我解决了pthread_self错误通过取消检查WITH_PTHREADS_PF在CMake

我也得到了类似

的东西

"opencv/sources/module/core/src/parallel.cpp": In function "int简历::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

但是事情没有进展,我仍然被同样的问题困住了。

然后我选中了CMake-GUI标志列表中的"WITH_PTHREADS_PF",然后继续。