1,cmake
2. codeblocks 16.1 (自带TDM-GCC mingw)
3. opencv 2.4.13
由于opencv下载下来的.exe安装包实际上是没有mingw(gcc)匹配的/动静态库,因此这些东西需要我们自己使用mingw编译。
首先是cmake配置,直接在source目录命令行下执行 cmake . 即可(注意后边有空格和代表当前目录的点号)
一般来说应该可以了,然后就是使用mingw32-make命令完成编译(过程较长),最后是使用mingw32-make install 生成需要的文件(头文件/动/静态库)
C:. ├─include │ ├─opencv │ └─opencv2 │ ├─calib3d │ ├─contrib │ ├─core │ ├─features2d │ ├─flann │ ├─gpu │ │ └─device │ │ └─detail │ ├─highgui │ ├─imgproc │ ├─legacy │ ├─ml │ ├─nonfree │ ├─objdetect │ ├─ocl │ ├─photo │ ├─stitching │ │ └─detail │ ├─superres │ ├─ts │ ├─video │ └─videostab └─x86 └─mingw ├─bin └─lib
将bin加入系统path变量中。
原始错误输出如下:
C:\opencv\sources\modules\highgui\src\window_w32.cpp: In function 'int icvCreateTrackbar(const char*, const char*, int*, int, CvTrackbarCallback, CvTrackbarCallback2, void*)': C:\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:\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:2198: 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
主要就是有几个变量没有找到,后来在一个opencv的issues里找到了解答,大概意思就是在mingw的头文件commctrl.h中,对于上面的变量宏的定义实际上是由_WIN32_IE是否定义来决定的,然而我们找到这个头文件的时候,他的写法是这样:
#include <prsht.h> #ifdef __cplusplus extern "C" { #endif #ifndef _WIN32_IE /* define _WIN32_IE if you really want it */ #if 0 #define _WIN32_IE 0x0300 #endif #endif
看提示我们也知道,默认根本就不可能找到_WIN32_IE这个变量(后来查了一下,这个变量应该是规定所谓的windows的ie浏览器版本的变量,不知道怎么和opencv扯上了关系),所以上面那个issues的建议是改成:
#include <prsht.h> #ifdef __cplusplus extern "C" { #endif #ifndef _WIN32_IE /* define _WIN32_IE if you really want it */ #if 1 #define _WIN32_IE 0x0500 #endif #endif
那个0x0500也是我照改的,改完之后我确实能编译通过了,不知道保持原样会怎么样,个人估计 不编译帮助的话,应该就没有这个错误了,只有帮助才和 IE 相关啊。