OpenCV1.0静态库编译

 转自:http://blog.csdn.net/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.csdn.net/source/691624

VS2005版在:http://download.csdn.net/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环境而独立运行了。

你可能感兴趣的:(OpenCV1.0静态库编译)