OpenCV3.1 VS2010静态编译和动态编译

前言

MinGW编译器目前仅能编译OpenCV2.x.x版本,OpenCV3.x.x并不支持MinGW编译器。最重要的是,OpenCV使用的Intel的IPP库是没有MinGW版本的,最直观的差别就是,使用OpenCV开发的实时图像处理程序在处理速度上,VC版本要比MinGW版本快至少一倍,这一点我是深有体会。所以在windos平台上使用OpenCV,最好还是老老实实的使用微软自家的编译器。

OpenCV官方默认使用动态链接库的形式发布,平时写OpenCV程序用于学习和研究就算拉,当程序需要发布时,尤其是程序需要拷到没有OpenCV环境的机器上运行时,一堆的动态链接库弄得好烦,而且OpenCV3.1官方发布版本默认不包含vc10(也就是vs2010的编译器)的库,只好重新尝试编译。

编译前,需要提前下载并安装好Cmake和VS2010,并下载好OpenCV3.1的源代码。

先说静态编译

  1. 如图,在Cmake中配置好源代码路径和生成路径,configure之后,去掉BUILD_SHARED_LIBS的选项,另外,如果用不到,建议也去掉BUILD_EXAMPLES,BUILD_TESTS,BUILD_PERF_TESTS这个三个选项,否则,由于静态编译的原因,会产生非常多且非常大的各种示例程序,此外,还有一项BUILD_opencv_world的选项,可以把所有的组件综合到一个名为opencv_world310.lib的文件中,使以后配置工程时无需输入各种冗繁的库文件,一个就搞定,十分方便,使用VS编译时,一般都可以勾选(MinGW编译器貌似目前不能编译OpenCV3.x.x,仅能编译OpenCV2.x.x,而且BUILD_opencv_world选项不能勾选,会出错),其他的使用默认即可。
    OpenCV3.1 VS2010静态编译和动态编译_第1张图片

  2. 点击Generate之后,去目录中找到OpenCV.sln文件,用VS2010打开,使用released模式生成即可(debug版本没有必要,因为调试阶段使用静态编译会很浪费时间,直接使用动态库就可以了)。

  3. 生成结束之后,到工程目录中,把D:\OpenCV3.1\build\vc10\lib\Release文件夹中的opencv_world310.libopencv_ts310.lib两个文件捞出来,放到个人指定的文件夹中,还需要到D:\OpenCV3.1\build\vc10\3rdparty\lib\Release文件夹中把libjpeg.lib, ippicvmt.lib等一票第三方库文件也捞出来,和前面两个库文件放到一起。头文件直接使用官方默认体统的OpenCV和OpenCV2那连个文件夹即可。至此,静态编译完成。

再说动态编译

仅仅在使用Cmake配置环境时,保留BUILD_SHARED_LIBS这个选项即可,编译出来的东西就是动态库,编译完成之后需要同时把lib文件夹中的.lib文件和bin文件夹中的.dll文件都捞走,并把.dll文件存放的目录添加到系统路径即可。

此外,使用静态库编译自己的程序时,有2点需要额外注意的点:

  • 当程序需要从摄像头引入视频时,必须链接VFW库,这个库是VS自带的,仅需在自己的主程序中添加以下两行代码即可,否则会产生链接错误。
#pragma comment( lib, "vfw32.lib" )
#pragma comment( lib, "comctl32.lib" )
  • 由于OpenCV使用了ffmpeg的库,不管你是静态编译还是动态编译,ffmpeg库都是以动态链接库的形式出现,毕竟动态链接库是以后的趋势。这一点你可以在OpenCV的动态编译和静态编译中发现,编译完成后,都会在bin目录中产生opencv_ffmpeg310.dll文件。所以,当你的程序需要处理外部视频时,无论你的编译形式是静态还是动态,当程序发布时,都需要opencv_ffmpeg310.dll的支持,否则,程序无法打开视频文件。

你可能感兴趣的:(OpenCV)