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

首先要明确在没有安装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可能需要自己编译一遍,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的隐式调用方式。

隐式调用一般需要:

声明函数接口的.h文件------include文件夹里的内容
链接动态库的.lib文件------lib文件夹里的内容以及Input->Additional Dependencies添加的XX.lib

动态链接库.dll文件------bin文件夹的内容

这里bin文件夹是在系统环境目录里的,所以执行代码是exe文件可以找到。也可以添加

系统文件中,把需要用到的dll拷贝到exe同一个文件夹下即可。

所以,如果把未发布的工程拷贝到没有opencv的电脑上,只要把需要用的函数相关的.h,.lib以及.dll文件考过去即可。

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

显示调用是不需要.lib和.h文件的。是在代码里"显示"加载要用到的函数。例如:

HINSTANCE hDLL=NULL;//生命DLL句柄

hDLL=LoadLibrary("opencv_core242d.dll"); //加载DLL

HMAT myImread=(HMAT)GetProcAddress(hDLL,"imread"); //使用DLL中的函数

这样在拷贝工程时只拷贝用到的DLL文件就可以。

但这样代码写得很麻烦,DLL换个名字版本之类的要改很多地方,一般用得不多。

如果只是给别人静态链接的exe程序(比如一个demo,不用跑程序),那只要给别人dll文件就可以。

也就是将需要用到的dll文件拷到exe文件夹下即可,Release拷贝XX.dll,Debug版本拷贝XXd.dll

(所以我们写Additional Dependencies不用到的尽量不写,这样拷的dll会少一些~)再一种方法就是楼上提到的把OpenCV的源码一起编译到可执行文件中。
这样就不用拷贝dll文件,只是生成的exe会比较大

相关推荐
qq_273900231 小时前
pytorch register_buffer介绍
人工智能·pytorch·python
龙的爹23332 小时前
论文翻译 | The Capacity for Moral Self-Correction in Large Language Models
人工智能·深度学习·算法·机器学习·语言模型·自然语言处理·prompt
python_知世3 小时前
2024年中国金融大模型产业发展洞察报告(附完整PDF下载)
人工智能·自然语言处理·金融·llm·计算机技术·大模型微调·大模型研究报告
Fanstay9853 小时前
人工智能技术的应用前景及其对生活和工作方式的影响
人工智能·生活
lunch( ̄︶ ̄)3 小时前
《AI 使生活更美好》
人工智能·生活
Hoper.J3 小时前
用两行命令快速搭建深度学习环境(Docker/torch2.5.1+cu118/命令行美化+插件),包含完整的 Docker 安装步骤
人工智能·深度学习·docker
Shaidou_Data3 小时前
信息技术引领未来:大数据治理的实践与挑战
大数据·人工智能·数据清洗·信息技术·数据治理技术
Elastic 中国社区官方博客3 小时前
开始使用 Elastic AI Assistant 进行可观察性和 Microsoft Azure OpenAI
大数据·人工智能·elasticsearch·microsoft·搜索引擎·全文检索·azure
qq_273900234 小时前
pytorch detach方法介绍
人工智能·pytorch·python
AI狂热爱好者4 小时前
A3超级计算机虚拟机,为大型语言模型LLM和AIGC提供强大算力支持
服务器·人工智能·ai·gpu算力