OpenCV——VS2013_CMake_opencv3.1动态库与静态库的配置与编译

  通常我们的OpenCV项目在学习或研究阶段,使用动态库足矣,当OpenCV程序需要发布时,尤其是程序需要拷到没有OpenCV环境的机器上运行时,静态库文件就会比较便捷。本文记录OpenCV3.1源码编译动静态库的方法和注意事项。

       1. 编译环境

****操作系统:Win10**************

****编译环境:VS2013 x64*********

****CMake 版本:3.5.2*************

****OpenCV版本:3.1**************

      2. Opencv3.1动态库编译(含opencv_contirb)

      OpenCV3.0的发布版本中同时包含动态库和静态库,OpenCV3.1和OpenCV3.2官方默认使用动态库的形式发布,若想使用静态库,需自行通过源码编译。编译动态库的方法可以参考cmake-gui和vs2013编译opencv和opencv_contrib源码一文。今天再提一次主要是为了强调BUILD_opencv_world和BUILD_opencv_contirb_world相关的问题点,具体内容可以参考第4小节。

      3. Opencv3.1静态库编译(含opencv_contirb)

      OpenCV的源码中的CMAKE文件默认编译动态库,默认勾选BUILD_SHARED_LIBS选项,编译静态库时只需要取消该选项即可,这也是编译静态库和动态库的在设置上唯一差别,如下图所示。

OpenCV——VS2013_CMake_opencv3.1动态库与静态库的配置与编译

       划重点:强烈建议去掉BUILD_EXAMPLES,BUILD_TESTS,BUILD_PERF_TESTS这个三个选项(这三个选项默认勾选),否则静态编译的示例程序非常大,以博主的血泪经验告诉各位同学:如果这三项全选,编译出的文件会大于50G!!!

       按照cmake-gui和vs2013编译opencv和opencv_contrib源码一文中的CMAKE选项,仅取消上述选项,设置完成后,configure和generate,按照编译动态库的方法编译即可。因在编译动态库时已为“OPENCV_EXTRA_MODULES_PATH”赋值opencv_contrib源码中modeles所在路径,编译静态库时也会包含opencv_contrib。

       4. BUILD_opencv_world和BUILD_opencv_contirb_world

       按照默认的CMAKELIST编译出来的项目,包含大量.lib和.dll文件,在开发opencv程序时,需要一一指定lib文件,并将所有dll复制到程序目录或设置到PATH环境变量里,非常不方便。CMake中有一个选项名为BUILD_opencv_world,默认是不勾选的,它可以把所有的组件综合到一个名为opencv_world310d.lib或opencv_world310.lib的文件中,使以后配置工程时输入此单一文件即可。其中310d代表Debug版本,310代表release版本。

        我在编译静态库时同时勾选了BUILD_opencv_world和BUILD_opencv_contirb_world,编译成功,未遇到任何错误。

        同时勾选了BUILD_opencv_world和BUILD_opencv_contirb_world之后,在编译动态库时,在configure时遇到如下错误:

OpenCV——VS2013_CMake_opencv3.1动态库与静态库的配置与编译

       CMake具体信息如下:

CMake Error at cmake/OpenCVModule.cmake:295 (message):
No extra modules found in folder: D:/opencv3x/opencv/sourcesContrib/modules
Please provide path to ‘opencv_contrib/modules’ folder.
Call Stack (most recent call first):
modules/CMakeLists.txt:7 (ocv_glob_modules)

OpenCV——VS2013_CMake_opencv3.1动态库与静态库的配置与编译

       我确定本人电脑上opencv_contrib源码的路径从未变更过,所以我删除了D:\opencv3x\opencv\build路径下的全部内容,并重启电脑,所有的操作重新来过,CMAKE  configure和generate成功。

       在编译时又遇到下图错误:

OpenCV——VS2013_CMake_opencv3.1动态库与静态库的配置与编译

       后经查阅,很多人反应Opencv3.2版本有bug,如果同时选定了OPENCV_EXTRA_MODULES_PATHBUILD_opencv_world,则会报出无法找到xfeatures2d/cuda.hpp文件的错误 根据此现象,我觉得Opencv3.1可能也有同样的Bug,我取消OPENCV_EXTRA_MODULES_PATH的设置后,编译BUILD_opencv_world即可成功。若有同学遇到相同的错误,可以一试。

      5. 关于ffmpeg

      由于OpenCV使用了ffmpeg的库,不管编译静态库或动态库,是否选定了BUILD_opencv_world,ffmpeg库都是以动态链接库的形式opencv_ffmpeg310.dll出现。所以,当你的程序需要处理外部视频时,无论你的编译形式是静态还是动态,当程序发布时,都需要opencv_ffmpeg310.dll的支持,否则,程序无法打开视频文件。