codeblocks下OpenCv搭建

来源:互联网 发布:致胜轮毂数据 编辑:程序博客网 时间:2024/05/21 07:00

前面用了wxWidgets写好了图形界面,串口接收数据部分,因为其24位位图原因,于是我又选择了OpenCv库,下载完源码后自己编译,因为wxWidgets使用MinGW编的,而两者第后面又要集成到一起,所以OpenCv也要用MinGW编了,使用cMake工具+MinGW。第一次编译失败了,到41%失败,这时候没去看出错信息,又得知用64位MinGW可编,于是乎再次cMake工具+MinGW_x64,编译成功了,但是我忘记了我的wxWidgets使用自带MinGW编的了,哭。。。

后面继续尝试用自带MinGW编译,得到原有错误,这次看了错误,如下:

opencv-3.2.0\modules\highgui\src\window_w32.cpp:50:6: warning: "_WIN32_IE" is not defined [-Wundef]
哦,还有这个编译可以接着上次进度,我后来才知道,之前失败了都傻乎乎的删掉重来。。。还有这个关IE啥事。。。。

对于错误,百度之,fq谷歌之,得到在CodeBlocks\MinGW\include目录下,即gcc编译器的头文件commctrl.h中有这么一段:

#ifdef __cplusplusextern "C" {#endif#ifndef _WIN32_IE/* define _WIN32_IE if you really want it */#if 0#define _WIN32_IE0x0300#endif#endif
看这段,嗯,他是不可能被定义的。。。。

外国友人推荐改成如下:(红字部分)

#ifdef __cplusplusextern "C" {#endif#ifndef _WIN32_IE/* define _WIN32_IE if you really want it */#if 1#define _WIN32_IE0x0500#endif#endif
我一想,有道理,改之,编译之,结果:

D:\opencv-3.2.0\modules\highgui\src\window_w32.cpp:50:6: warning: "_WIN32_IE" is not defined [-Wundef] #if (_WIN32_IE < 0x0500)      ^D:\opencv-3.2.0\modules\highgui\src\window_w32.cpp:51:99: note: #pragma message: WARNING: Win32 UI needs to be compiled with _WIN32_IE >= 0x0500 (_WIN32_IE_IE50) #pragma message("WARNING: Win32 UI needs to be compiled with _WIN32_IE >= 0x0500 (_WIN32_IE_IE50)")

他喵的明明别人说编译通过了

于是去找window_w32.cpp这个,上面警告可知为甚么要改成0x0500

#if (_WIN32_IE < 0x0500)#pragma message("WARNING: Win32 UI needs to be compiled with _WIN32_IE >= 0x0500 (_WIN32_IE_IE50)")#define _WIN32_IE 0x0500#endif#include <commctrl.h>//注意这行
这个。。。。这个顺序怎么会定义呢?

换顺序。。。。。再次编译之.......

D:\opencv-3.2.0\modules\highgui\src\window_w32.cpp: In function 'void cvSetModeWindow_W32(const char*, double)':D:\opencv-3.2.0\modules\highgui\src\window_w32.cpp:473:47: error: 'MONITOR_DEFAULTTONEAREST' was not declared in this scope             hMonitor = MonitorFromRect(&rect, MONITOR_DEFAULTTONEAREST);                                               ^D:\opencv-3.2.0\modules\highgui\src\window_w32.cpp:473:71: error: 'MonitorFromRect' was not declared in this scope             hMonitor = MonitorFromRect(&rect, MONITOR_DEFAULTTONEAREST);                                                                       ^D:\opencv-3.2.0\modules\highgui\src\window_w32.cpp: In function 'LRESULT MainWindowProc(HWND, UINT, WPARAM, LPARAM)':D:\opencv-3.2.0\modules\highgui\src\window_w32.cpp:1376:45: error: 'MONITOR_DEFAULTTONEAREST' was not declared in this scope           hMonitor = MonitorFromRect(&rect, MONITOR_DEFAULTTONEAREST);                                             ^D:\opencv-3.2.0\modules\highgui\src\window_w32.cpp:1376:69: error: 'MonitorFromRect' was not declared in this scope           hMonitor = MonitorFromRect(&rect, MONITOR_DEFAULTTONEAREST);
百度得commctrl包含window编程中的控件API的定义。在用SDK编程时使用控件时使用。于是MONITOR_DEFAULTTONEAREST,MonitorFromRect,就是未定义的东西。

即这一句

          hMonitor = MonitorFromRect(&rect, MONITOR_DEFAULTTONEAREST);
由MSDN知此函数头文件定义于

Minimum supported client

Windows 2000 Professional [desktop apps only]

Minimum supported server

Windows 2000 Server [desktop apps only]

Header

Winuser.h (include Windows.h)
于是,包含之,再编译。。。。。。。又不行。。。

找到winuser.h有

#if (_WIN32_WINNT >= 0x0500 || _WIN32_WINDOWS >= 0x0410)WINUSERAPI HMONITOR WINAPI MonitorFromPoint(POINT,DWORD);WINUSERAPI HMONITOR WINAPI MonitorFromRect(LPCRECT,DWORD);WINUSERAPI HMONITOR WINAPI MonitorFromWindow(HWND,DWORD);
wtf,百度知if里面的东西是指定windows版本的。。。呵呵

//  // _WIN32_WINNT version constants  //  #define _WIN32_WINNT_NT4                    0x0400 // Windows NT 4.0  #define _WIN32_WINNT_WIN2K                  0x0500 // Windows 2000  #define _WIN32_WINNT_WINXP                  0x0501 // Windows XP  #define _WIN32_WINNT_WS03                   0x0502 // Windows Server 2003  #define _WIN32_WINNT_WIN6                   0x0600 // Windows Vista  #define _WIN32_WINNT_VISTA                  0x0600 // Windows Vista  #define _WIN32_WINNT_WS08                   0x0600 // Windows Server 2008  #define _WIN32_WINNT_LONGHORN               0x0600 // Windows Vista  #define _WIN32_WINNT_WIN7                   0x0601 // Windows 7  #define _WIN32_WINNT_WIN8                   0x0602 // Windows 8  #define _WIN32_WINNT_WINBLUE                0x0603 // Windows 8.1  #define _WIN32_WINNT_WINTHRESHOLD           0x0A00 // Windows 10  #define _WIN32_WINNT_WIN10                  0x0A00 // Windows 10  

就是说MinGW里windows版本可能是0x0400,呵呵

找到然后改掉。。

投降了,换成2.4.13,编译一次通过。。。。强烈怀疑我刚开始下的是develop版本。。










1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 lol画面卡住了怎么办 PLSQL DEV未响应怎么办 英雄联盟载入慢怎么办 玩英雄联盟黑屏怎么办 电脑玩lol死机怎么办 输入不支援黑屏怎么办 一加玩游戏登录不了怎么办 网络连接错误711怎么办 电脑网络错误651怎么办 打游戏内存不够怎么办 电脑超频后黑屏怎么办 玩lol显示器超频怎么办 win10显示器超频黑屏怎么办 电脑开机显示超频怎么办 玩英雄联盟网卡怎么办 英雄联盟超屏怎么办 三星手机基带未知怎么办 显卡进桌面黑屏怎么办 电脑开机黑屏怎么办打开 ap黑屏打不开了怎么办 老人机屏幕变黑怎么办 电脑一直弹网页怎么办 电脑一直跳网页怎么办 电脑网页一直转圈怎么办 消费者联盟闪退怎么办 门卡住了打不开怎么办 悦平台出现bug怎么办 lol开不了全屏怎么办 韩服lol忘记密码怎么办 股票交易密码忘记了怎么办 指纹解锁密码忘记怎么办 玩lol美服有延迟怎么办 逆水寒黑屏崩溃怎么办 逆水寒游戏崩溃怎么办 lol切换黑屏了怎么办 英雄联盟花屏怎么办 笔记本开机黑屏怎么办 win10 笔记本联盟fps低怎么办 lol超出显示范围怎么办 lol游戏进去黑屏怎么办 lol老是卡顿怎么办