在此范围内未声明构建OpenCV :: MonitorFromRect时出错

时间:2014-01-13 22:55:37

标签: c++ opencv build mingw mingw32

我尝试构建OpenCV version 2.4.8以将其与CodeBlocksMinGw一起使用。我按照here的说明进行操作。但是我得到了以下错误。我不知道如何解决它。我没有通过网络搜索找到任何有用的东西。

This也没有解决。

我不想弄乱openCV代码,我打算在我的项目中使用OpenCV,这是我第一次使用它。

[ 26%] Built target pch_Generate_opencv_highgui
[ 26%] Building CXX object modules/highgui/CMakeFiles/opencv_highgui.dir/src/window_w32.cpp.obj
C:\Program Files (x86)\opencv\sources\modules\highgui\src\window_w32.cpp: In function 'void cvSetModeWindow_W32(const char*, double)':
C:\Program Files (x86)\opencv\sources\modules\highgui\src\window_w32.cpp:477: error: 'MonitorFromRect' was not declared in this scope
C:\Program Files (x86)\opencv\sources\modules\highgui\src\window_w32.cpp: In function 'LRESULT MainWindowProc(HWND__*, UINT, WPARAM, LPARAM)':
C:\Program Files (x86)\opencv\sources\modules\highgui\src\window_w32.cpp:1355: error: 'MonitorFromRect' was not declared in this scope
mingw32-make.exe[2]: *** [modules/highgui/CMakeFiles/opencv_highgui.dir/src/window_w32.cpp.obj] Error 1
mingw32-make.exe[1]: *** [modules/highgui/CMakeFiles/opencv_highgui.dir/all] Error 2
mingw32-make.exe: *** [all] Error 2 

我试图在文件中手动包含函数的原型,但后来又链接错误 有谁请告诉我这里可能出了什么问题?我该如何解决?

3 个答案:

答案 0 :(得分:10)

似乎所有来自最近提交的更改都没有反映在您的结帐中。要解决问题,请进行以下更改:

modules/highgui/src/precomp.hpp中,添加+标记的行:

 #if defined WIN32 || defined WINCE
 +    #if !defined _WIN32_WINNT
 +        #ifdef HAVE_MSMF
 +            #define _WIN32_WINNT 0x0600 // Windows Vista
 +        #else
 +            #define _WIN32_WINNT 0x0500 // Windows 2000
 +        #endif
 +    #endif
 +
      #include <windows.h>

modules/highgui/src/window_w32.cpp中,删除-标记的行:

 #if defined WIN32 || defined _WIN32

 -#define COMPILE_MULTIMON_STUBS // Required for multi-monitor support
 -#ifndef _MULTIMON_USE_SECURE_CRT
 -#  define _MULTIMON_USE_SECURE_CRT 0 // some MinGW platforms have no strncpy_s
 -#endif
 -
 -#if defined SM_CMONITORS && !defined MONITOR_DEFAULTTONEAREST
 -#  define MONITOR_DEFAULTTONULL       0x00000000
 -#  define MONITOR_DEFAULTTOPRIMARY    0x00000001
 -#  define MONITOR_DEFAULTTONEAREST    0x00000002
 -#  define MONITORINFOF_PRIMARY        0x00000001
 -#endif
 -#ifndef __inout
 -#  define __inout
 -#endif
 -
  #ifdef __GNUC__
  #  pragma GCC diagnostic ignored "-Wmissing-declarations"
  #endif

  #include <commctrl.h>
 -#include <winuser.h>
  #include <stdlib.h>
  #include <string.h>

这将解决构建错误。

答案 1 :(得分:1)

在使用mingw32构建OpenCV 3.0.0 RC1并启用TBB库时,我遇到了同样的问题。

Rajdhar的修复程序已包含在precomp.h文件中。但是,由于在使用TBB库构建OpenCV时,额外的包括再次触发相同的问题。

我暂时通过将Rajdhar指示的_WIN32_WINNT的定义移到文件中的早期点,在opencv / core包含之前暂时解决了这个问题:

#ifndef __HIGHGUI_H_
#define __HIGHGUI_H_

#include "opencv2/highgui.hpp"

// MOVED UP
#if defined WIN32 || defined WINCE
    #if !defined _WIN32_WINNT
        #ifdef HAVE_MSMF
            #define _WIN32_WINNT 0x0600 // Windows Vista
        #else
            #define _WIN32_WINNT 0x0500 // Windows 2000
        #endif
    #endif

    #include <windows.h>
    #undef small
    #undef min
    #undef max
    #undef abs
#endif
// END MOVED

#include "opencv2/core/utility.hpp"
#include "opencv2/core/private.hpp"

#include "opencv2/imgcodecs.hpp"

#include "opencv2/imgproc/imgproc_c.h"
#include "opencv2/imgcodecs/imgcodecs_c.h"
#include "opencv2/highgui/highgui_c.h"

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <limits.h>
#include <ctype.h>
#include <assert.h>

// MOVED FROM HERE

#ifdef HAVE_TEGRA_OPTIMIZATION
#include "opencv2/highgui/highgui_tegra.hpp"
#endif

答案 2 :(得分:-1)

我遇到了完全相同的问题,在快速浏览文件winuser.h后,我知道发生了什么,并在命令中向CFLAGSCXXFLAGS添加了必要的宏行:

CFLAGS=-D_WIN32_WINNT=0x0500 CXXFLAGS=-D_WIN32_WINNT=0x0500 make

然而,问题仍然没有解决。添加VERBOSE=1表示自定义CFLAGSCXXFLAGS根本没有生效。它很奇怪,我认为它应该与我的环境有关,但是,我仍然无法弄明白。无论如何,@ Rajdhar的答案解决了我的问题,谢谢。