OPENCV脱离库的静态链接方法

来源:互联网 发布:p2p风控程序员 编辑:程序博客网 时间:2024/05/17 17:58

 由于OpenCV自2.3.0版本开始就提供了OpenCV-2.3.x -win-superpack.exe或OpenCV-2.4.x.exe文件,该文件解压后我们会发里面有个名为“build”的文件夹,其中有各个平台的链接库,而且还提供了Windows平台下的静态链接库
本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2012-08/68301.htm。

要给老师整理做过的算法各种脱离OPENCV库的可执行文件,就又折腾起了静态链接问题 ,现在来说说如果想要你的程序在一台裸奔的电脑上运行,需要怎么办。

以OPENCV2.4.3+VS2010

第一种方法是粗暴的什么都不改变然后将有可能用到的DLL都拷贝到文件夹中,这时候如需要opencv_highgui243.lib,是来自 opencv\build\x86\vc10\lib,以前使用这种方法,带需要拷贝的DLL太多,比较麻烦。

第二种方法是采用OPENCV的静态链接库,我觉得很神奇,搜索了一下,大家都在自己编译静态链接库,但是其实OPENCV自己已经编译好了静态链接库,就在 opencv\build\x86\vc10\staticlib中,只是和LIB中的opencv_highgui243.lib等名字相同,所以如果你并没有修改过OPENCV的源代码通过以下几步快速配置静态库:

以RELEASE为例

(1)在Linker选项->General->Additional Library Directories选择<Edit…>,删去原来的“$(OpenCV2_4_3_Dir)\ lib”,然后在编辑框中输入“$(OpenCV2_4_3_Dir)\ staticlib”后确定(这里OpenCV2_4_3_Dir是环境变量是你安装OPENCV的路径,比如我的是D:\Study\OpenCV2.4.3\build_vc10)。

(2)在Linker选项->Input->Additional Dependencies选择<Edit…>,然后在编辑框中输入一下内容后确定:

vfw32.lib

comctl32.lib

zlibd.lib

libjasperd.lib

libjpegd.lib

libpngd.lib

libtiffd.lib

IlmImfd.lib

opencv_core243d.lib

opencv_imgproc243d.lib

opencv_highgui243d.lib

opencv_ml243d.lib

opencv_video243d.lib

opencv_features2d243d.lib

opencv_calib3d243d.lib

opencv_objdetect243d.lib

opencv_contrib243d.lib

opencv_legacy243d.lib

opencv_flann243d.lib

(3)项目属性面板下-C/C++ /代码生成-/若是RELEASE选择MT,若是DEBUG选择MTD,然后编译生成即可。


opencv静态编译

原来写的那篇文章实在过于简陋,而且日子一长,本人也没有再编译成功过。今天有兄弟相求,我便再次研究了一遍。现将结果再作一下总结。

OpenCV现在的版本是1.0,已经很长时间没有更新了,不知道下个版本什么时候放出。其实,OpenCV的.dll文件并不多,如果想脱离这些.dll,使用静态库的话,那么一个小小的程序也差不多近2MB了。不过为了演示及发布方便,编译为静态库也算是一种需要吧。

想编译成静态库,就需要了解一个知识:运行库(Runtime Library)。运行库是最基本的库,配合C++的语法及操作系统实现了一些基本的功能,如内存操作(new/delete等)等。可以说运行库是任何程序,库的基础。在VC(2005以上)中有四种运行库:Multi-threaded、Multi-threaded-Debug、Multi-threaded-dll、Multi-threaded-debug-dll:前两个为一组,是静态类型库,提供的函数会被链接到最后的程序中,其中两者的区别就在于一个带些调试用的信息及检查代码;后两个为一组,是动态库,最后会以动态链接库的形式(如在VC2008中为MSVCR90.dll或MSVCR90D.dll),提供函数给程序调用。当编译项目的时候,以上四种运行库,只能选择其中一种;若项目还引用了其它库,那么被引用的库应该与这个项目使用同样的运行库。否则,或者链接不能通过,或者是出现链接警告。试想,如果同时选择了Multi-threaded、Multi-threaded-Debug,那么就有两种new的实现方法,链接器应该选择谁呢?(其实,也并不是不能组合两种运行库如一个用msvcr90.dll的a.dll和使用此a.dll的.exe程序,只不过两种运行库不能链接到同一程序中.)所以,想要地发布能独立运行的OpenCV程序,就需要让程序引用的各个库都统一的为Multi-threaded或Multi-threaded-debug。

OpenCV 1.0 for Windows安装好后,在bin目录下,有已经编译好的Multi-threaded-dll版本的.dll库,但这不是独立程序所需。以下要说明的是如何使用Multi-threaded运行库的方法。在_make目录里,打开opencv.sln。项目中有cv、cvaux、cvinfo、cvspamle、cvtest、cxcore、cxcoretest、cxts、highgui、ml等共10个小工程,其中cv、cvaux、cxcore、cxts、highgui、ml等6个工程为需要编译的库。首先,要解决代码上的一个bug:打开cvaux工程的cvaux.h文件,仔细看1137行,注释的后半部分打错成?号了,改回来。接着,切换到Release版,同时选中6个工程,然后更改属性:A.在General下,改Output Directory,这是改变库的输出路径;B.同General下,改Configuration Type为Static Library (.lib)。这表示要生成静态库;C.在/C++/Code Generation下,选择Multi-Threaded,这是我们需要的运行库。这样,便能生成需要的静态库了。(之前写的文章说highgui还需要特别设置,那是多余的)

以上过程只是完成了非常简单的一部分,我们还需要打开otherlibs/_graphics/src目录下的graphic_lib.sln项目,做同样的更改,编译出Multi-Threaded的静态库(默认的为Multi-Theaded Dll的库)。但是,libjasper.lib这个库没有源码,得从网上下载后,编译为相应的版本。这样,准备工作算是完成了。

要生成独立的程序,还需要设置。可以拿cvsample来测试。同样在Release版下,首先,C++/Code Generation要改为Multi-Threaded。其次,Linker/General下,Additional Library Directories要添加上刚才这些静态库的的路径如otherlibs/_graphics/lib。最后,在Linker/Input中,Additional Dependencies里,添加先前生成的静态库名字cxcore.lib cv.lib highgui.lib libjpeg.lib libpng.lib libtiff.lib libjaspermt.lib zlib.lib comctl32.lib。(注意comctl32.lib也需要添上)。编译后,用Depends软件,看生成的cvsample.exe是否只包含系统里一些基本的.dll文件。如果是这样,那表明已经成功了。注意看是否有链接错误,有的话,说明cvsample所依赖的库里,有非Multi-threaded版本的运行库。

小结一下,生成这些静态库和生成独立运行的OpenCV程序还是比较麻烦的,关键在设置好运行库版本。libjasper.lib在OpenCV的安装包里只有Multi-Threaded-Dll版本,而且不带源码,这就是说,默认的OpenCV1.0是不能以静态方式链接到程序中去的。


0 0
原创粉丝点击