opencv静态编译与动态编译.docx
一、序言当一个opencv工程实现之后,我们会面临一个问题,怎么把opencv程序的 exe在其他电脑上运行,这个问题已经有很多人遇到过,当然也有很多人给出了 博客,介绍了具体的解决方法,具体自己操作时,还是遇到了这样或者那样的小 毛病,不过凭借自己根据错误提示解决问题的能力,最后还是把静态编译给编译 成功了。本文介绍两种opencv程序移植到其他电脑运行的方法,一种是动态编译, 需要拷贝程序运行需要的dll,也就是-个exe跟着多个dll的模式,这种简单 粗暴,但是显得拖拖拉拉,一个程序还得跟着那么多其他文件,所以我们很不推 荐。另外一种就是本文主要介绍的静态编译,和之前运行不一样,我们在这使用 的不是opencv的lib库,而是staticlib,编译成功之后,程序只需要拷贝一 个exe,就可以在其他电脑上运行。另外介绍一下本文测试程序工作的程序配置操作系统Win7IDEVS2010opencv 版本 opencv2.4.5二、动态编译为了做一个全面的总结,在这简单的介绍opencv动态编译的方法。opencv动态编译需要两部分dll:(1)opencv库的dll,检查你所引用的h文件,把对应的dll,拷贝过来就 行,注意debug和release的不同,当然一般程序发布的话都会用release版本 的,因为release版本比debug版本要快10倍有余。(2)考虑到目标终端有可能没有装vs,所以需要拷贝msvcp110.dll和 msvcr110.dll (release 下),dll 在 C:/Windows/System32 下。三、静态编译静态编译主要的不同就是利用的是H:/Opencv2.4.5/opencv/build/x86/vc11/staticlib 文件下的 lib,而非 H:/Opencv2.4.5/opencv/build/x86/vc11/lib 文件夹。具体配置如下:1. 新建空项目,项目名称Static_Opencv7叨曰T! 1T4-E)fl -"二KEg诟glE*妻型:V -H-iJll C l 1q rt 4立月气环t豆须e MFC位段序"si 5AIL cm厘win?项B哧心|匚4 +药芸珀Visul C+tWin32ut tlTllSZ i gEi Ith'.K#STN;:如&皿1>5XAui-i u侦.mKE如!横 112. 新建cpp,写入一个简单opencv测试程序:#include <opencv2/core/core.hpp>#include<opencv2/highgui/highgui.hpp>using namespace cv;void main()( cv:Mat image = cv:imread(img1.png); cv:flip(image,image,1);cv:imwrite(flip.jpg,image);3. 新建一个属性管理器视图-属性管理器-Debug-右键-添加新项目属性表Etatic_Openci.- - Microsoft Visual 京udi苣退昊)文件旧翔旧视图CV) 项目囚生成调沛切 巨'iQ ' 密 作,本增 Windows属性莒- Static_Clpe-ncv,毕XmaJ 已 Debug | Wii乒 MiboscdA Applicati 廿A Multi-byt X,Core Wir 无.:日 Release | Wi '/ Microsd '属性表名称改为 PropertySheetStaticOpencvdebug。> > m=+* &tatic_Opencv褫址新项目属性表P.商E现有雇性表日移除Del妻峰MF2属性A Whole Program Optitnization/ Application乒 Multi-byte Character Sup-port夕 Core Windows Libraries4. 编辑属性表右键属性表-属性-VC+目录-包含目录,然后添加opencv的h文件目录:(pnv) is程甘也定+HO匹簸iflLt+*肆.碧土三岳Jfnitlw有号m 见 mrL.W-z-o=WTu41.疤二0="1寸0>二七弓工tn,lMcl5E?p 匚 soLiEHT.口 £在匚LAMJdM忐凸=W£MA3rePKlnffltsEDAMxl三一书IWUE亏奁言上一 £:血电电宅 ZA5MDLQi<?=4>PHui.Ek p-'54 亡 A?福 M££<r._!国>.5.-.9smle%?=suj尝5项§尸 wg.Eq_o_m料tlK-1*! 1*11*1 区匚strffmlftl s 备 F匚罗酣皿并tw"皿3M 照叩故CX史% 串 35W - 盘|£.蚌 3SSS康*州0|4f>3£OJVE招-H-L-JWCxmAi -i弟加MrtHJts-Kws-+U& 赭皿:M参蛆sjBWP Sr.qap.-T3.pd 曰/4-n+J5l4u心-Esr占leelI低lyI-c备一 一卅蚌E3-JSI_介绍一下这四个选项,多线程(/MT)为静态链接release模式,多线程调试(/MTd) 为静态链接debug模式,多线程dll (/MD)为动态链接release模式,多线程 调试DLL(/MDd)为动态链接debug模式。5.最后在程序中添加#pragmatic,使用程序调用lib完整的程序如下:#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#pragma comment( lib, IlmImfd.lib)#pragma comment( lib, libjasperd.lib)#pragma comment( lib, libjpegd.lib)#pragma comment( lib, libpngd.lib)#pragma comment( lib, libtiffd.lib)#pragma comment( lib, zlibd.lib)#pragma comment( lib, opencv_core245d.lib)#pragma comment( lib, opencv_highgui245d.lib)#pragma comment( lib, vfw32.lib )#pragma comment( lib, comctl32.lib ) using namespace cv;void main()( cv:Mat image = cv:imread(img1.png);cv:flip(image,image,1); cv:imwrite(flip.jpg,image); 最后程序运行会出现很多warning,但是不影响运行,程序大小为7.5M ! 挺大的,但是一个大程序,总比一个exe跟着多个dll好啊。1 -1J J J-r. " JS _ id ./I i : link-FC.rradrXtlo92014/5/18 16;&7| ; linlc-FE.wn . 1 .tl-n g201J/S/1B 16; S7、main,objME/WW"J-«r *1 jTLO& 文件:KBTIJOG g1 KB啊2 R沽174 KS*1 StatlcjDpencv.eiie. 314/6/LS I&5-/应用程序75S0KB|D StaticjOpencv.ilk2014/&/1B 16:S7ncrtrnentfll Link. 11,955 KB6.程序运行结果 原图:结果图: