OpenCV各个版本在VS2013下的配置在网上有很多人进行了详细的介绍,在此不作赘述,主要是配置环境变量,添加各种依赖库的问题。
但是如果照着文档一步一步走便能轻松大功告成的话,程序员们可能做梦都会笑醒。所以说bug是无处不在的,我们的目标就是消除一切bug!
Q1:error LNK2019: 无法解析的外部符号 _gzputs,该符号在函数 "void __cdecl icvPuts(struct CvFileStorage*,char const *)" (?icvPuts@@YAXPAUCvFileStorage@@PBD@Z) 中被引用。
A1:在项目---属性---链接器---输入---附加依赖项中添加依赖项(reference):
libpngd.lib
libtiffd.lib
zlibd.lib
IlmImfd.lib
libjasperd.lib
libjpegd.lib
comctl32.lib
gdi32.lib
vfw32.lib
Q2:errorLNK1104: 无法打开文件“.obj”
A2:检查一下附加依赖项中是否有两个库写在同一行了,两个库(.lib)必须以回车分开.
Q3:RELEASE和DEBUG模式下lib切换的问题
(error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”)
(error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”)
A3:在第一次配置opencv库的时候,大多数人可能会一次性将opencv中对应的debug和release的库都添加到项目属性的附加依赖项中,但往往在之后调试的过程中会出现上述错误。
首先需要弄清debug和release的区别(reference),在调试时选择属性---C/C++---代码生成---运行库时需要弄清下面几个概念:
多线程调试Dll (/MDd) 对应的是MD_DynamicDebug
多线程Dll (/MD) 对应的是MD_DynamicRelease
多线程(/MT) 对应的是MD_StaticRelease
多线程(/MTd)对应的是MD_StaticDebug
另外,在opencv的库中,以d结尾的表示debug对应的库,其他表示release的库。
在此推荐一种简洁方便的方法,新建一个.h文件,放在opencv的include/opencv2文件夹下(我的是D:\Open2411\opencv\build\include\opencv2),此后只用在程序中包含这个头文件便能成功通过编译。
//配置DEBUG和RELEASE模式下的opencv库
#ifndef _OPENCV_LIB_
#define _OPENCV_LIB_
#ifdef _DEBUG
#pragma comment(lib, "opencv_calib3d2411d.lib")
#pragma comment(lib, "opencv_contrib2411d.lib")
#pragma comment(lib, "opencv_core2411d.lib")
#pragma comment(lib, "opencv_features2d2411d.lib")
#pragma comment(lib, "opencv_flann2411d.lib")
#pragma comment(lib, "opencv_gpu2411d.lib")
#pragma comment(lib, "opencv_highgui2411d.lib")
#pragma comment(lib, "opencv_imgproc2411d.lib")
#pragma comment(lib, "opencv_legacy2411d.lib")
#pragma comment(lib, "opencv_ml2411d.lib")
#pragma comment(lib, "opencv_nonfree2411d.lib")
#pragma comment(lib, "opencv_objdetect2411d.lib")
#pragma comment(lib, "opencv_photo2411d.lib")
#pragma comment(lib, "opencv_stitching2411d.lib")
#pragma comment(lib, "opencv_ts2411d.lib")
#pragma comment(lib, "opencv_video2411d.lib")
#pragma comment(lib, "opencv_videostab2411d.lib")
#else
#pragma comment(lib, "opencv_calib3d2411.lib")
#pragma comment(lib, "opencv_contrib2411.lib")
#pragma comment(lib, "opencv_core2411.lib")
#pragma comment(lib, "opencv_features2d2411.lib")
#pragma comment(lib, "opencv_flann2411.lib")
#pragma comment(lib, "opencv_gpu2411.lib")
#pragma comment(lib, "opencv_highgui2411.lib")
#pragma comment(lib, "opencv_imgproc2411.lib")
#pragma comment(lib, "opencv_legacy2411.lib")
#pragma comment(lib, "opencv_ml2411.lib")
#pragma comment(lib, "opencv_nonfree2411.lib")
#pragma comment(lib, "opencv_objdetect2411.lib")
#pragma comment(lib, "opencv_photo2411.lib")
#pragma comment(lib, "opencv_stitching2411.lib")
#pragma comment(lib, "opencv_ts2411.lib")
#pragma comment(lib, "opencv_video2411.lib")
#pragma comment(lib, "opencv_videostab2411.lib")
#endif
#endif
如果大家已经在附加依赖项中添加了所有的库,可以在视图---其他窗口---属性管理器---双击Microsoft.Cpp.Win32.user删除掉添加的openCV库再添加头文件,否则会有其他错误出现。
最后,万事开头难,大家多点耐心一定会解决问题的!
