原来写的那篇文章实在过于简陋,而且日子一长,本人也没有再编译成功过。今天有兄弟相求,我便再次研究了一遍。现将结果再作一下总结。
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可能需要根据情况添加到项目中去。