opencv 2.1 与opencv 2.4.4静态编译(主要是opencv 2.1)

来源:互联网 发布:freebsd linux nvidia 编辑:程序博客网 时间:2024/06/10 13:28

半年前总结的心得,虽然现在opencv高级版本都自带了静态库,但是还是想把我的经验和大家分享。当然,其中很大一部分也参杂了其他人的经验。

编译静态库需要的工具及文件:

1.VS2010

2.OpenCV源码包(OpenCV-2.1.0)

3.Cmake2.8.9  http://www.cmake.org/cmake/resources/software.html

 

1.运行OpenCV源码包,安装到D:\OpenCV-2.1.0

 

2.安装Cmake并打开设置

Where is the rource code  :OpenCV源代码所在的文件夹

Where to build the binaries:CMake配置好得到的文件放在位置D:\OpenCV-2.1.0\OpenCV-Cmake

然后点击configure,选择"Visual Studio 10"。然后确定。

等待configure完成,会出现很多红色的选项,因为主要是生成OpenCV的库,所以只需保留某些选项:

去掉BUILD_NEW_PYTHON_SUPPORT,BUILD_SHARED_LIBS,BUILD_TESTS

勾选OPENCV_BUILD_3RDPARTY_LIBS, WITH_TBB,WITH_JASPER,  WITH_JPEG,  WITH_PNG, WITH_TIFF选项,

然后再点击configure,提示TBB_INCLUDE_DIR找不到,因为我们不需要TBB库,所以忽略,再一次点击configure。

等待配置完成,最后点击generate,完成后关闭CMake。

 

具体cmake图文操作,网上有很多介绍,没有太大的争议,可采用。

3.VC++2010编译静态库

在D:\OpenCV-2.1.0\OpenCV-Cmake中打开.sln文件,打开项目管理器

按住ctrl键,选中除过ALL_BUILD, INSTALL, ZERO_CHECK, uninstall四个项目的其他所有项目,在菜单中选择项目->属性,打开配置属性->c/c++->代码生成选项,在右侧窗口中的运行时库中选择多线程调试(/MTd),然后确认。

注:这里有四个选项(/MT, /MTd, /MD, /MDd),前两个一组,为静态链接运行时库,运行时不需要运行时库的支持,代码直接插入到程序中去;后两个一组,为动态链接运行时库,运行时需要msvcr90.dll或msvcp90.dll支持。(我的理解就是VC的运行环境——静态库)

 

Relsea MT debug MTd

 

先编译Debug版的OpenCV静态库,在解决方案"opencv"(22个项目)上单击右键,选择重新生成解决方案,此时便开始编译OpenCV库了,等编译结束会提示完成16个,失败4个:

 

这四个项目生成的是exe程序,不需要管他们。到这步我们已经生成了Debug版本的静态库!

然后我们用相同的方式生成Release版的库,在之前的基础上只需要将选项选择多线程/MT,再进行编译。编译时警告很多,直接忽略!

最终需要的静态库就存在于:D:\OpenCV2.1.0\OpenCV-Cmake\lib 和  D:\OpenCV2.1.0\OpenCV-Cmake\3rdparty\lib  两个目录。分别

将 D:\OpenCV2.1.0\OpenCV-Cmake\3rdparty\lib 中Debug  下面的所有文件Copy到D:\OpenCV2.1.0\OpenCV-Cmake\lib 中的Debug   文件中。

将 D:\OpenCV2.1.0\OpenCV-Cmake\3rdparty\lib 中Release下面的所有文件Copy到D:\OpenCV2.1.0\OpenCV-Cmake\lib 中的Release文件中。

 

 

至此,静态库编译完成了,不再依赖OpenCV库。

 

 

要链接的库:cv210d.lib cxcore210d.lib highgui210d.lib zlibd.lib flannd.liblibjasperd.lib libjpegd.lib libpngd.lib libtiffd.lib opencv_lapackd.libvfw32.lib videoinput.lib。  (我的理解是opencv的静态库)

 

遇到问题解决:不使用预编译头文件

 

还有一个问题就是悲催的发现OpenCV自带的静态lib文件和动态lib文件命名是相同的,这可如何在附加依赖项中选择填写啊,还是用我自己写的后缀名不同的库做测试吧(后来发现只有在配置的vc++目录里的库文件目录中添加staticlib路径,然后把该路径的顺序调整到lib路径前,就可以优先调用staticlib了)。我在我原来的程序里测试了一下,还是不能编译通过,很让我恼火,求助了高人发现是附加依赖库并没有添加完全,找到对应的3rdparty\lib文件夹下面的zlibd.liblibjasperd.liblibjpegd.liblibpngd.liblibtiffd.lib。把这几个文件copy到安装目录下,并在vs2008中配置好,这次有些可以编译通过了,但涉及到video的highgui.lib还是不能通过。查了一下,是没有调用系统库文件vfw32.libvideoInput.lib(这个lib可以在cmake时选择是否使用),新的gui还调用了滑杆控件,还需要添加comctl32.lib这个lib,把这两个库链接时添上即可。总结一下,就是需要多添加comctl32.lib vfw32.lib zlibd.lib libjasperd.lib libjpegd.liblibpngd.lib libtiffd.lib opencv_core231d.lib opencv_objdetect231d.libopencv_highgui231d.lib opencv_imgproc231d.lib,对应的release版本就把带d后缀的去掉即可。

 

综上所述:在VC++目录下——库目录下添加刚编译好的库目录D:\vc2008\OpenCV-2.1.0\vc 2010\lib\Release或\Debug

release链接器下面的输入

vfw32.lib

comctl32.lib

cv210.lib

cxcore210.lib

highgui210.lib

zlib.lib

flann.lib

libjasper.lib

libjpeg.lib

libpng.lib

libtiff.lib

opencv_lapack.lib

videoinput.lib

debug链接器下面的输入

vfw32.lib

comctl32.lib

cv210d.lib

cxcore210d.lib

highgui210d.lib

zlibd.lib

flannd.lib

libjasperd.lib

libjpegd.lib

libpngd.lib

libtiffd.lib

opencv_lapackd.lib

videoinput.lib

 

注意videoinput.lib这个库文件是从源文件里面拷贝过来

并且在最开头加上#pragma comment(linker, "/NODEFAULTLIB:atlthunk.lib")


4.opencv 2.4.4静态编译

这个是现在我用的版本,个人感觉较之前静态编译更加方便,其静态库已经编译好,F:\Opencv\build\x86\vc10\staticlib  这是我的静态库路径,添加进去即可,调试改成 /MTD (debug)  
编译运行回出现错误,加上下面两行试试:

#pragma comment( lib, "vfw32.lib" )  
#pragma comment( lib, "comctl32.lib" )

原创粉丝点击