OpenCV1.0静态库编译

 转自:http://blog.youkuaiyun.com/jarodpku/archive/2008/10/15/3081298.aspx

 

 

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是不能以静态方式链接到程序中去的。

 

我编译好的用于VS2008的静态库Multi-Threaded版可在此处下载:http://download.youkuaiyun.com/source/691624

VS2005版在:http://download.youkuaiyun.com/source/694836

另外,cvcam这个库目前不能编译。vfw32.lib可能需要根据情况添加到项目中去。

 

 

 

    四. 独立程序的运行。对独立程序设置下环境如下:

    1. 设置->常规->Microsoft基础类(M):使用MFC作为静态链接库
    2. 设置->c/c++->Code Generation 中的Use run-time library中 选择Multithreaded DLL
    3. 设置->c/c++->预处理器 中的预处理器定义中添加:,CVAPI_EXPORTS附加包含路径中加:
C:/Program Files/OpenCV/cxcore/include,C:/Program Files/OpenCV/cvaux/include,C:/Program Files/OpenCV/cv/include,C:/Program Files/OpenCV/otherlibs/highgui
    4. 设置->连接中的对象/库模块加入:
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib cxcorel.lib cvl.lib highguil.lib cvcamL.lib

    5. 编译运行。这样你的程序就可以脱离OPENCV环境而独立运行了。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值