无法解析的外部符号

如下:

记得之前就出现过这个问题,当时被我解决了。但是没记博客,现在又一次遇到了。但是忘了怎么回事了。。。。。所以记一下。也许我的解决方法并不具有普适性。


是环境的问题。一直很好奇安装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----------------------------------

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

keneyr

老爷~给小的赏点盘缠吧555~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值