[opencv]OpenCV项目的动态编译和静态编译

来源:互联网 发布:在linux部署禅道 编辑:程序博客网 时间:2024/06/04 17:47

环境:

opencv:2.4.10
visual studio:2013
windows7 64位

1.Dll(Dynamic Link Library)和Lib文件

DLL(Dynamic Link Library)文件:动态链接库文件
在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件。
特点:
(1)使用较少的资源(当多个程序使用同一个函数库时,DLL 可以减少在磁盘和物理内存中加载的代码的重复量)
(2)推广模块式体系结构
(3)简化部署和安装(当 DLL 中的函数需要更新或修复时,部署和安装 DLL 不要求重新建立程序与该 DLL 的链接。此外,如果多个程序使用同一个 DLL,那么多个程序都将从该更新或修复中获益。当您使用定期更新或修复的第三方 DLL 时,此问题可能会更频繁地出现)

Lib
LIB有两种,一种是静态库,比如C-Runtime库,这种LIB中有函数的实现代码,一般用在静态连编上,它是将LIB中的代码加入目标模块(EXE或者DLL)文件中,所以链接好了之后,LIB文件就没有用了。一种LIB是和DLL配合使用的,里面没有代码,代码在DLL中,这种LIB是用在静态调用DLL上的,所以起的作用也是链接作用,链接完成了,LIB也没用了。至于动态调用DLL的话,根本用不上LIB文件。 目标模块(EXE或者DLL)文件生成之后,就用不着LIB文件了。

2.动态编译与静态编译的区别

静态编译,就是编译器在编译可执行文件的时候,将可执行文件需要调用的对应动态链接库(.so或.lib)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖于动态链接库。
与动态编译的区别
动态编译的可执行文件需要附带一个的动态链接库。在执行时,需要调用其对应动态链接库中的命令。所以其优点一方面是缩小了执行文件本身的体积,另一方面是加快了编译速度,节省了系统资源。缺点一是哪怕是很简单的程序,只用到了链接库中的一两条命令,也需要附带一个相对庞大的链接库;二是如果其他计算机上没有安装对应的运行库,则用动态编译的可执行文件就不能运行。

3.opencv项目的动态编译

以之前一篇《opencv学习- 鼠标画彩色图》为例
http://blog.csdn.net/kingcooper/article/details/50821594
将项目改为release版本,将链接器-输入-附加依赖项改为对应的lib
如2.4.10版本进行如下添加:
opencv_nonfree2410.lib
opencv_legacy2410.lib
opencv_features2d2410.lib
opencv_calib3d2410.lib
opencv_contrib2410.lib
opencv_core2410.lib
opencv_flann2410.lib
opencv_gpu2410.lib
opencv_highgui2410.lib
opencv_imgproc2410.lib
opencv_ml2410.lib
opencv_objdetect2410.lib
opencv_ts2410.lib
opencv_video2410.lib
qtmain.lib
Qt5Core.lib
Qt5Gui.lib
Qt5Widgets.lib
Qt5Sql.lib
运行生成exe可执行文件。
要在无opencv环境下的电脑中进行直接运行,则会报缺少opencv相关动态链接库的错误。
这里需要将opencv安装目录下vc12下bin目录的dll进行一起拷贝,release版本为无后缀d的dll,debug则有d。
查找exe运行所需dll的工具depend下载链接:
http://www.dependencywalker.com/
在别人电脑上测试时报错缺少msvcp120.dll和msvcr120.dll文件,下载添加后可运行。
鼠标画彩图DemoA下载链接如下
http://download.csdn.net/download/kingcooper/9462968

4.opencv项目的静态编译

仍然以《opencv学习- 鼠标画彩色图》为例
http://blog.csdn.net/kingcooper/article/details/50821594
(1)将项目改为release版本,将链接器-输入-附加依赖项改为对应的lib
添加如下:
IlmImf.lib
libjasper.lib
libjpeg.lib
libpng.lib
libtiff.lib
opencv_calib3d2410.lib
opencv_contrib2410.lib
opencv_core2410.lib
opencv_features2d2410.lib
opencv_flann2410.lib
opencv_gpu2410.lib
opencv_highgui2410.lib
opencv_imgproc2410.lib
opencv_legacy2410.lib
opencv_ml2410.lib
opencv_nonfree2410.lib
opencv_objdetect2410.lib
opencv_ocl2410.lib
opencv_photo2410.lib
opencv_stitching2410.lib
opencv_superres2410.lib
opencv_ts2410.lib
opencv_video2410.lib
opencv_videostab2410.lib
zlib.lib
kernel32.lib
user32.lib
gdi32.lib
winspool.lib
comdlg32.lib
advapi32.lib
shell32.lib
ole32.lib
oleaut32.lib
uuid.lib
odbc32.lib
odbccp32.lib
vfw32.lib
comctl32.lib
前面几个为opencv使用的第三方库
中间部分看个人使用到了哪些就添加哪些
后面为一些依赖库,不添加会报无法解析的外部符号之类的错误
【注】对于依赖库名称的获取有比较简单的方式,参考啸傲居士的博文
http://blog.csdn.net/shuxiao9058/article/details/7525067
比如在静态库中,创建makeList.bat文件
内容编辑如下:
dir *2410.lib /ON /B > lib.txt  
运行便将2410相关的lib名称添加到名称叫做lib.txt里了。
对于库也可用以下方式在源码中进行添加
#pragma comment( lib, "opencv_highgui2410.lib" )
(2)将属性-C/C++-代码生成-运行库进行更改
多线程(/MT)为静态链接release模式,多线程调试(/MTd)为静态链接debug模式,多线程dll(/MD)为动态链接release模式,多线程调试DLL(/MDd)为动态链接debug模式。
这里选择多线程(/MT)模式
(3)将VC++目录-库目录更改为vc12的staticlib
(4)进行release版本的静态编译,生成的exe文件大小为2.44MB,动态编译生成的exe文件大小只有94KB
静态编译比动态编译生成的exe文件更大,但是不需要进行相关Dll文件的添加。
静态编译生成的鼠标画彩图DemoB下载链接见:
http://download.csdn.net/download/kingcooper/9463318
(5)执行生成的exe文件,除了绘图窗口,还会显示cmd窗口。
添加头文件
#include <windows.h>
在main函数中添加
ShowWindow(GetConsoleWindow(), SW_HIDE);
即可消除显示。


参考链接:

Dll wikipedia

Dll 百度百科

Lib 百度百科

http://blog.csdn.net/wuan584974722/article/details/7953220

http://blog.csdn.net/wuan584974722/article/details/7953213

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

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

http://blog.csdn.net/yang_xian521/article/details/7022701

http://blog.csdn.net/yang_xian521/article/details/7027190

http://blog.csdn.net/lanbing510/article/details/8806602

1 0
原创粉丝点击