如下:
记得之前就出现过这个问题,当时被我解决了。但是没记博客,现在又一次遇到了。但是忘了怎么回事了。。。。。所以记一下。也许我的解决方法并不具有普适性。
是环境的问题。一直很好奇安装opencv之后那些配置都干啥的。只有明白了,才能看懂错误。
编写c++的人都知道,要使用别人编好的dll,需要三种文件,及头文件、后缀名为“lib”的链接文件,后缀名为“dll”的动态库文件。如果使用静态编译方式,那么需要头文件和静态库文件。x86是32位操作系统。x64是64位操作系统。
(1)“build\x64\vc12\bin”目录下放的是OpenCV运行时所需的动态运行库,如下:
(2)“build\x64\vc12\lib”目录放的是编译OpenCV程序时所需的的动态链接库,
(3)“build\x64\vc12\staticlib”目录方式的静态编译时OpenCV所需要的静态链接库,如果是静态编译,运行时则不需要“build\x64\vc12\bin”目录的DLL文件,但编译后的文件较大。
为了使vs2015能够编译OpenCV程序,我们需要对VS2015做一些设置,主要是让VS2015能找到OpenCV的头文件和链接库。在“OpenCV安装目录\build\doc”目录下有个名为“opencv_tutorials.pdf”的PDF文档,里面的1.5节“How to build application with OpenCV inside the Micorosoft Visual Studio”说明了如何配置VS2015。原来我D盘的版本是2.4.11.0啊!装了太久了,都已经忘掉了。。
忍不住去看看我F盘的opencv,竟然是3.0版本。因为是,300表示版本,是3.0。不过好奇怪的是,这两个opencv下面的文件差别好大啊。。。。
这里说一下:vs2013vs12,vs2015对应vs14,vs2017对应vs15。opencv2.x和3.x版本的差别其实很大。
这是还说一下,在网上搜有的帖子配置只配置了vs属性页,并没有配置环境变量。有的又都配置了。那么到底有什么用呢?
其实配置高级变量--》系统环境变量--》Path意思就是:这个路径下的所有可执行文件,都会具有全局性,无论在何时何地,只要输入该文件名,就可以直接执行。
详细解释:
windows系统下,假如我们安装了某一款软件,安装结束后,在安装目录会生成一个该软件的.exe文件,双击该文件,我们就能启动软件。但是难道我们每次要运行该软件的时候都要先找到该.exe文件所在的路径,然后双击吗,显然是不可能的,因为安装的软件太多,我们根本不可能记住所有已安装软件的路径,同时如果我们在其他路径下想运行某些软件岂不是完蛋了。
这时候就需要环境变量了。
所以如果系统变量里是一种opencv版本,用户变量里又是一种opencv版本,这样应该会打架把。可能会造成全局变量重复?
来看看opencv3.4是啥样的,没有x86了好像,支持vs2015和vs2017,果然与时俱进。没有了静态库:
感觉D盘的opencv2.x被我之前改坏了。可能是之前不懂,瞎几把放东西。。。。还在c盘下面放了好多,应该是很久很久以前运行比较老的工程项目,用到了opencv2.x,然后配置x86平台时放进去的:
决定现在统一用opencv3.4,配置一下vs2015:
打开我之前配置的工程,打开视图-->其他窗口-->属性管理器:
我要配置Debug下的x64:
这时候我的系统环境变量和用户环境变量都没有配置opencv。试试看,项目是否可以运行,在运行的时候提示我:
这说明vs找不到该dll文件,为什么会找不到呢?该文件命名就在opencv下面啊~因为啊,vs不知道dll文件在opencv该路径下面啊。如果把该路径放在环境变量下是否就可以找到了呢?那是肯定的~ 但是又想到,如果我不把该路径放在系统环境PATH下,而是放在system目录下,会怎么样呢?
动手实验一下:
再次运行项目:哇塞~真的没有问题了耶~~~~其实那是因为,system32路径在环境变量下,所以把dll文件放在这里也相当于声明了全局变量。。
但是个人不推荐这种方式,毕竟以后会有很多外部dll文件,难道都放在system32下面吗?太难受了!还是把路径复制在系统环境变量下吧!!(把system32下的dll文件删掉)
这样vs项目也是能够运行滴~~~记得重启哦~~~
下面说一下qtcreator创建的项目配置新版opencv3.4
之前的pro配置是这样的:
但是因为opencv3.x该路径下的文件和opencv2.x该路径下的文件一点都不一样。。。lib文件都没了。。如下:
所以改成了这样:
试着重建了项目:
这就奇怪了?我明明环境变量都设置好了。vs都没有问题,怎么qtcreator就无法打开呢?难道是因为版本的问题?因为我的QTCreator用的是vs2017的编译器:
那试试看:
错误依然没有改变。。。呸,是路径没该对,D盘换成E盘:
于是错误兜兜转转又回去了:
仔细看了看,竟然是我程序上的错误。我在一个函数中的声明了:
CvConversion* sconversion = new CvConversion();
然后在函数末尾
delete sconversion;
把delete这个语句删掉就没错了。
看来类指针不用delete啊? 该写一篇C++类对象和类指针区别的博客了。。。。。emmm
----------------------------END----------------------------------