基于OpenCV的程序脱离动态链接库运行方法

题目来自OpenCV·China的每周一练:

我们在做项目时,通常需要把依赖于opencv,vs(例如vs2005),或者vc(例如vc6.0)的程序,在没有安装相关环境的电脑上去运行。那么现在有哪些方法可以摆脱这些依赖?(提供可行建议即可得10分)

http://www.opencvchina.com/thread-1368-1-1.html

解决方法:

首先要明确在没有安装OpenCV的电脑上,要运行基于OpenCV库的程序,有两种方法:一、将OpenCv安装目录下的bin目录下的*.dll文件 与应用程序一起打包发布。

二、将OpenCV库源代码加载到工程中和应用程序一起编译,也就是说最后生成的可执行文件可以单独运行,不需要OpenCV的动态链接库。下面将详细介 绍这种方法。

 

首先要确定程序使用了OpenCV的哪些库函数,一般来说,cv、cxcore和highgui是必需的,为简化说明,下面将只编译这三个库,如果有使用 其它库,同样也要加入。系统环境为:WindowsXP+VC6.0+OpenCV1.0。

1、  为方便管理,先将OpenCv安装目录下的cv、cxcore、otherlibs/highgui三个目录复制到你的工程目录。

2、  在集成开发环境的项目管理窗口中(FileView)新建两个文件夹,分别为opencv_src,opencv_include。

3、  在项目管理窗口中右击opencv_include项,选择Add Files to Folder...,将第1步中已复制至工程目录下的三个目录下的include目录中的.h文件添加到该项目管理文件夹中。接着按相同做法将三个目录下 的src目录中的.cpp文件添加到opencv_src项目管理文件夹中。

4、  几点注意:dummy.cpp在三个目录下都有,只需要添加一次。Highgui目录下以cvcap开头的.cpp文件为摄像头相应库,如果你的程序没有 处理视频,不要添加这些.cpp文件。不要添加window_carbon.cpp文件,原因还不明。

5、  右击opencv_src,选择Setting...,选择C/C++页,在Category选择Precompiled Headers,再选择下面四个单选项中的第一项”Not using precompiled headers”。这样做的目的是不使用编译头文件,否则会产生“找不到文件结尾”的错误。也可以在每个.cpp文件的开头加入include ”stdafx.h”,但显然没有更改一个选项来得方便。

6、  在Project->Settings...->C/C++中,选择Category中的Preprocessor项,把 Additional include directories改为cv/include,cv/src,highgui, cxcore /include, cxcore /src

7、  Project->Settings...->Link,如果Object/library modules中有cv.lib,cvaux.lib,highgui.lib,删除之

补充:

OpenCV的安装

我们下载的OpenCV安装包一般包括源码,示例,文档和编译好的动态链接库(以前OpenCV可能需要自己编译一遍,OpenCV2.3.1之后都有一个build的文件夹,有编译好的mingw,vc9和vc10的版本)。
我们写代码如果调用OpenCV的函数,需要添加附加依赖项:
Include Directories : C:\OpenCV\OpenCV-2.4.2\build\include
Library Diractories: C:\OpenCV\OpenCV-2.4.2\build\x86\vc10\lib
然后还需要在 Linker->Input->Additional Dependencies 里添加会用到的各种XX.lib,XXd.lib
还有把两个bin文件夹:
C:\OpenCV\OpenCV-2.4.2\build\x86\vc10\bin
C:\OpenCV\OpenCV-2.4.2\build\common\tbb\ia32\vc10
添加到 系统环境目录
有的安装教程里还会教我们在Source Directories添加OpenCV的源码文件,其实是不需要的。因为实际调用OpenCV里的函数是用的dll的隐式调用方式。

DLL调用

隐式调用一般需要:

声明函数接口的.h文件 ——include文件夹里的内容
链接动态库的.lib文件 ——lib文件夹里的内容以及Input->Additional Dependencies添加的XX.lib
动态链接库.dll文件 ——bin文件夹的内容
这里bin文件夹是在系统环境目录里的,所以执行代码是exe文件可以找到。也可以添加在系统文件中,把需要用到的dll拷贝到exe同一个文件夹下即可。
所以,如果把未发布的工程拷贝到没有opencv的电脑上,只要把需要用的函数相关的.h,.lib以及.dll文件考过去即可。


另一种调用dll的方式是显示调用:

显示调用是不需要.lib和.h文件的,只会用到dll文件。

但需要在代码里“显示”加载要用到的函数。例如:

[cpp]  view plain copy
  1. HINSTANCE hDLL=NULL;//生命DLL句柄    
  2. hDLL=LoadLibrary("opencv_core242d.dll");  //加载DLL  
  3. HMAT myImread=(HMAT)GetProcAddress(hDLL,"imread");  //使用DLL中的函数  
这样在拷贝工程时只拷贝用到的DLL文件就可以。
但这样代码写得很麻烦,DLL换个名字版本之类的要改很多地方,一般用得不多。

静态编译的exe程序

如果只是给别人静态链接的exe程序,比如一个demo,不用跑程序。

最常用的方法就是一起拷贝exe和dll文件到目标电脑:
也就是将需要用到的dll文件拷到exe文件夹下即可,Release拷贝XX.dll,Debug版本拷贝XXd.dll
(所以我们写Additional Dependencies不用到的尽量不写,这样拷的dll会少一些~)


再一种方法就是楼上提到的把OpenCV的源码一起编译到可执行文件中。

这种需要在写代码时把OpenCV的源文件加入到工程中。也就是用到的.cpp文件目录添加到Source Directories项中。
编译头文件可能会遇到"找不到文件结尾”之类的错误,在项目属性Category中选择"Precompiled Headers"和"Not using precompiled headers"即可。

这样工程不是调用的OpenCV编译过的dll文件,而是把OpenCV当成你自己写的文件一样一起编译。

在没有安装OpenCV的电脑上只用拷贝最终的exe文件即可。不需要dll文件,只是生成的exe会比较大~

原博文:

http://blog.csdn.net/xiaowei_cqu/article/details/8066329

http://blog.csdn.net/charles_3081523/article/details/5765920

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV无法定位程序输入点于动态链接库是一个常见的错误,可能有多种原因导致。但是根据你提供的引用内容,可以给出一种解决方案。根据引用中的解决方案,你可以尝试以下两种方法来解决这个问题: 1. 替换环境变量位置:将opencvcontrib的环境变量位置放在opencv之前。这可以通过编辑系统的环境变量来实现。具体的步骤可以参考中提供的链接。 2. 将相关的dll文件放到System32文件夹下:将opencv_contrib\install\x64\vc16\bin文件夹下的opencv_world470.dll和opencv_world470d.dll,复制到C:\Windows\System32文件夹下。这样做是为了解决opencvopencvcontrib的dll文件冲突的问题。 根据原因的推测,这两种方法都可以解决OpenCV无法定位程序输入点于动态链接库的问题。请根据你的具体情况尝试这些解决方案,看是否能够解决你遇到的问题。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [Opencv Contrib 无法定位程序输入点于动态链接库](https://blog.csdn.net/qq_36829039/article/details/130593265)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [使用Python和OpenCV库进行简单的图像分类(附详细操作步骤).txt](https://download.csdn.net/download/weixin_44609920/88234143)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值