您的位置:首页 > 编程语言 > C语言/C++

VS 2015 +opencv 2.4.13 C++ .dll文件编写及调用

2016-11-12 15:34 197 查看
作为一个 小白。。捣鼓了几天的 .dll文件  也算是有了点心得,本文也只是个人理解
 

首先对于VS 2015 与 opencv 2.4.13的问题。由于opencv2.4.13并未直接给出VC14文件夹。。若想给VS2015装上opencv2.4.13 还得自己编译 

具体过程参考  http://blog.csdn.net/lfw198911/article/details/52649459   写的很细也很清楚。 ps:修改 PATH系统环境变量后必须重启才能生效...以往的博文中各种缺失.dll文件就

是由于这个原因!! 修改完PATH后只用重新启动才会有效,不然操作系统只知道先前的PATH变量。。并不会去访问你新加的路径 。。这就导致 在测试程序时。。发现能识别出

opencv的函数和头文件。。编译也没错,但就是在运行时各种报错...丢失.dll文件  。。这是由于当你配置好 工程的属性管理器后只是配置了.lib文件的位置。。而.lib中包含了

opencv函数名与实际编译后的函数名的映射(!!是的函数在编译后 函数名是会变的。。具体原理请问 度娘)由于 opencv也是使用.dll文件的形式进行加载。。 你的程序在编译

完成后并未正真的包含了opencv的代码。。它们仍然在.dll文件中 。只有当运行时,计算机才会根据需要动态的加载.dll文件,与你的程序进行链接,从而完成你的要求!!所以 当

运行出现 .dll文件丢失时 ,先查看PATH 是否包含了对应的库文件夹,重启电脑试试看,如果还是有问题,那么要不就是你的 .dll文件出问题了,要不就是真的丢失了!!  

PS: 网上所谓的在 C:\Windows\System32 或者 在C:\Windows\SysWOW64文件夹下 添加对应的.dll文件,就是因为这是 计算机对于.dll文件的默认搜索路径。。虽然这样做也能

解决问题,但不便于管理和更新。。久而久之只会变的更加的乱。。  作为一个“强迫症”患者(笑)表示有些问题还是得自己弄懂弄通的。。一直像个无头苍蝇乱撞,始终不是解决

问题的方法。。当然如果我的理解有误,勿喷


之前自己脑子抽筋硬是装了opencv 3.1结果在这就遇到问题了。。opencv3.0以后(我所知的3.0 及3.1) 的cv名字空间中有个“ACCESS_MASK”的宏与 windows.h头文件中的宏

同名了。。这就导致 如果想采用动态加载 .dll文件的话。。 当你想使用LoadLibrary函数而不得不加载 windows.h文件时各种报错。。“ACCESS_MASK”不明确。。 解决办法 手动加CV:: 去掉using namespace cv; 要不和我一样换opencv2.4.13

                     
                                                            蛋疼了很久。

对于.dll文件的编写。。没啥好说的。。可以看看孙鑫的视频 (19) 对于声明导出函数或类时有三种方式 ,可以查查MSDN 

PS:在VS 2015中 当使用.def文件时必须要在属性管理器中手动添加 ,不然VS是不知道的。



最后,加上我的一些个人理解。。如果要使用.dll中类中的成员函数时,最好导出整个类,虽然也有只导出成员函数仍能正常运行的例子。。但当类中还有其他的成员函数未被

导出时,这时候你虽然添加了头文件,使得计算机能认识这个类,并且知道它的某个函数在某个.dll文件中,但是它的其余成员函数的实现的呢?很明显答案是,没有实现。这

时候计算机该怎么办呢?我的答案是,计算机会把整个类当成是被 _declspec(dllimport)修饰的,从而在所有的.dll文件中查找,然而你在.dll中只导出了类的某个你所需要的成

员函数,并未导出整个类,所以就会报链接错误  LNK2019 LNK1120 。 这是对于你采用静态加载的方式使用.dll文件时会出现的问题。当使用静态加载的方式时,计算机会在

你的程序运行时同时加载 声明了静态加载方式的所有.dll文件。。如果你加载的多了这将会是一个不小的负担。。但当使用 动态加载时又会面临无法使用类的方式,所以我推荐

使用这种方式调用.dll中的类    详情请见  http://blog.csdn.net/chollima/article/details/5324808

以上只是个人理解,很欢迎大神们帮忙修改纠正。。

小白的第一篇长的。。就这样了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ visual studio opencv