在静态库下使用MFC和共享DLL下使用MFC 这两种情况 opencv的配置,以及配置opencv配置中容易出现的有关问题

在静态库下使用MFC和共享DLL下使用MFC 这两种情况 opencv的配置,以及配置opencv配置中容易出现的问题

       网上也有很多博客描述VS下opencv的配置,其实opencv的配置很简单,但是复杂就出现在你不同情况下配置opencv是有所不同的。

本作者绝对是看了网上几乎所有的博客,并且亲自配置,且在配置中出现了一个问题,用了整整一天的时间才搞好。

如果你做的项目要发布,最后肯定要将动态链接库DLL写到exe文件中,这样才能使你的软件/系统具有可移植性。

(大家通常在用MFC写小项目的时候书上/教学视频一般都是推荐你选择共享DLL下使用MFC)

以后真正遇到项目时才知道,最后都是要选择静态库下使用MFC的。

稍后我会详细描述在静态库下使用MFC  怎么去调整opencv的配置

基本的opencv配置可分为以下四步(本文中opencv是安装在D:\Program Files\opencv)

1.设置系统的环境变量(Path)

计算机->(右键)属性->高级系统设置->高级(标签)->环境变量->(双击)path(用户,系统里面的path任选其一)->在变量值里面添加;D:\Program Files\opencv\build\x86\vc10\bin(注意不同路径之间有个分号)

x86--------- 代表32位系统

x64--------- 代表64位系统

下面是配置系统环境变量的图

传图失败,请大家见谅哈!

2.设置VS中vc++目录的包含目录库目录以及执行目录

包含目录中编辑添加如下(这里面全是放着.h  .hpp等文件)

D:\Program Files\opencv\build\include
D:\Program Files\opencv\build\include\opencv
D:\Program Files\opencv\build\include\opencv2

库目录(设置lib文件的)

D:\Program Files\opencv\build\x86\vc10\lib

执行目录(设置DLL动态链接库的,程序要用到的dll文件)

D:\Program Files\opencv\build\x86\vc10\bin

注意:配置执行目录和配置VS中的环境变量PATH的效果是等同的,配置一个即可

3.附加依赖项的添加

首先声明一个opencv的Bug

如果你想你的opencv代码在Release和Debug下都可以完美运行这是不可能的!!!

(因为在调用依赖项的时候,两种情况下切换总会出现问题)

回归到正题添加附加依赖项

项目---属性---链接器---输入--第一行便是附加依赖项

Release下附加依赖项
opencv_calib3d247.lib
opencv_contrib247.lib
opencv_core247.lib
opencv_features2d247.lib
opencv_flann247.lib
opencv_gpu247.lib
opencv_highgui247.lib
opencv_imgproc247.lib
opencv_legacy247.lib
opencv_ml247.lib
opencv_nonfree247.lib
opencv_objdetect247.lib
opencv_ocl247.lib
opencv_photo247.lib
opencv_stitching247.lib
opencv_superres247.lib
opencv_ts247.lib
opencv_video247.lib
opencv_videostab247.lib



debug下附加依赖项
opencv_calib3d247d.lib
opencv_contrib247d.lib
opencv_core247d.lib
opencv_features2d247d.lib
opencv_flann247d.lib
opencv_gpu247d.lib
opencv_highgui247d.lib
opencv_imgproc247d.lib
opencv_legacy247d.lib
opencv_ml247d.lib
opencv_nonfree247d.lib
opencv_objdetect247d.lib
opencv_ocl247d.lib
opencv_photo247d.lib
opencv_stitching247d.lib
opencv_superres247d.lib
opencv_ts247d.lib
opencv_video247d.lib
opencv_videostab247d.lib
谨记:尽量不要将Debug和Release的都添加进去,如果你比较喜欢常用Debug下,你就只添加Debug下的附加依赖项(这点的原因一会儿再说)

到这基本是opencv算是都配置完成了,一般情况下是不会出现问题的,下面列举一些特殊情况供大家参考



重头戏来了哈!

1.我每次建立一个项目需要用opencv都需要配置以上这些步骤么?

当然可以解决不需要,一次就可以成功哈!

打开你任意的项目,然后按照下图进入到属性管理器

在静态库下使用MFC和共享DLL下使用MFC 这两种情况 opencv的配置,以及配置opencv配置中容易出现的有关问题

在静态库下使用MFC和共享DLL下使用MFC 这两种情况 opencv的配置,以及配置opencv配置中容易出现的有关问题

2.  一运行自己的程序就提示缺少各种opencv_core230d.dll等文件

答:这种情况是最容易解决的,肯定是你系统VS中的环境变量PATH(这里指的是VS中的PATH)/或者执行目录没有配置好,这需要配置一个即可哈!



3.怎么制作一个静态的opencvDemo?

4.我在自己电脑上写的软件(用到oepncv库的)怎么在别人电脑上(未配置环境的机子)执行?

5.MFC项目中选择在静态库下使用MFC的话,怎么配置opencv环境

注意:上面的问题都是一个解决办法

1.首先,你的lib选择staticlib

也就是VC++目录中的包含目录应该为如下路径

D:\Program Files\opencv\build\x86\vc10\staticlib

2.然后,属性页---配置属性----MFC的使用---在静态库下使用MFC

这样会将你程序用到的一些库写到你的exe文件中,换来的是可移植性,但是exe文件会稍微大一些哈!这是没办法的,因为你要将你程序用到的一些库写到里面,自然就大了哈!

3.再然后,属性----C/C++ -----代码生成----运行库选择位多线程调试(/MTd)

如果出现错误的话就换其他运行库方式(不出意外的话应该是这样哈)


在静态库下会出现这种异常错误

windows已在xx.exe中触发一个断点,其原因可能是堆被损坏,这说明xx.exe中或它所加载的任何DLL中有bug。 
原因也可能是用户在xx.exe具有焦点时按下了F12。
输出窗口可能提供了更多诊断信息 。

解决办法

1.确实是你程序错误,如果程序错误最有可能是你new的指针没有delete,或者某个内存没有分配就开始用再或者就是野指针等情况,最好单步调试,注意指针和数组,应该不难查出来错误哈!

2.就是opencv的配置错误

我在配置好opencv后发现我的程序在共享DLL下使用MFC是没有错误,但是一旦选择了静态库下使用MFC就出现了上面的错误

开始我也认为是指针的问题,可我单步调后感觉不对,所以又从配置上下了功夫,是一篇博客中的一句话提醒了我

Debug下面可能引用了Release下面静态编译的库。

因为我开始将所有的dll都添加到了附加依赖项,我是在Debug下进行调试的,同时又选择了静态编译,所以这些附加依赖项里面还有Release的dll,而我的代码就是引用了这些静态编译的库才会出现的问题,我随即将Release的dll从附加依赖项中去除,马上就好了哈!




-----以上就是自己在配置opencv的一些问题,欢迎大家补充,凡是有opencv配置方面的问题,请评论我会尽自己所能来解决哈!---