若在创建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解码包才可以)