首页 > 技术文章 > 基于MFC的OPENCV程序的静态编译

yyisgod 2015-12-24 15:06 原文

  若在创建MFC程序时没有选择在静态库中使用MFC也没有关系。在工程属性-常规-中设置

  

将 在共享DLL中使用MFC 改为静态。

 

  接下来到c++选项-代码生成 页面,将运行库/MD (/MDd)改为/MT (/MTd对应debug版本,既然要发布,也没必要用debug版本吧),更改了这两个设置,重新编译的MFC程序就是静态编译了的,拷贝到其他机器上不再需要提供MFC对应的DLL了。

  不过,如果程序中链接了其他的库(*.lib),那就不一样了。比如OPENCV的库。这里用OPENCV3.0来说明。默认情况下,OPENCV提供的*.lib文件都是动态编译的,运行时需要配合对应的DLL文件才能成功运行。(如果在下载得到的文件中有个staticlib文件夹,里面保存的就是静态编译的lib文件)如果用动态编译的库生成程序,得到的程序还会要求提供dll,包括vs的运行库等,会非常麻烦。

  目前官网下载的OPENCV3.0是没有提供vc14,即VS2015 对应的库文件的,而OPENCV3.1没有提供静态编译的文件。因此需要重新编译opencv的源代码。打开cmake-gui,设置好源代码目录及生成目录,点击Configure,选择vs2015(对应32位,64位需选vs2015 WIN64)。之后便得到配置界面。这里已经提供了静态编译的选项:

  

默认是选中,这里我们取消。另外本机并没有IPP库,因此还需取消WITH_IPP一项,否则编译调用OPENCV库的程序时时候会链接不了IPP对应的函数(如果你本机上有其库则不必取消,将其添加到附加依赖项即可)

  

之后选中BUILD_opencv_world选项,这项是3.0的功能,能够将所有的库集成到一个opencv_world中,省去了许多设置时的麻烦。选中了这项后,编译OPENCV不再会生成core,highgui等等这些单独的库对应的lib及dll文件。

  关于其它项的具体配置,可以看情况选择。比如tiff文件的支持,视频的支持等等。如果要处理视频,尽量选中这些项,都是些解码器的支持。

 

  这里就应该可以看清楚了,opencv对于各种图片、文件格式的支持并不是靠本身的库实现的,还是要调用一些图片格式处理库(比如libjpeg)及 视频解码器(如果系统没有解码器,那么opencv是打不开视频的)。

配置完以后点击个generate,这样就在目标目录下生成了解决方案。用VS2015打开sln文件就可以编译了。debug,模式编译debug的库,release编译release的库。

  因为我们选择的是静态编译,生成的工程也自动设置成了静态编译的样子。编译结束后,到lib文件夹下拷贝出opencv_world300.lib文件,我们一般放库的地方,方便程序链接。另外要将3rdparty\lib 文件夹下生成的库文件拷到同一目录

  之后在MFC程序中将链接的库改为这个静态编译的库。(注意修改目录,因为静态编译的库与动态编译的文件名是一样的)。

  然而此时虽然程序是可以编译的,但是链接是会出错的。看提示可以知道我们还需要链接从3rdparty\lib 拷出来的库文件。在附加依赖项中填写:

  opencv_world300.lib

  IlmImf.lib

  libjasper.lib
  libjpeg.lib
  libpng.lib
  libtiff.lib
  libwebp.lib
  zlib.lib

之前配置时选择了什么,这里就需要加上。另外因为为了视频还选择vfw,所以额外要加一个vfw32.lib(vc自带)

这样之后,整个程序就可以静态编译了。如果程序有视频读取处理功能,此时的程序已经可以做了。(然而,对于大部分的视频可视,可能还需要目标机器上装了ffdshow解码包才可以)

 

推荐阅读