CMake + OpenCV3.4.1 + VS2017静态编译

引言

最近在做毕业设计的过程中,想要在未安装OpenCV环境的机器上运行我的OpenCV+MFC代码。但是从OpenCV3.1开始官方默认使用动态库的形式发布。我想使用静态库通过静态链接来将所用到的库链接进exe文件中,所以进行了OpenCV源码的静态编译。

准备工作

CMake:https://cmake.org/

OpenCV:https://opencv.org/releases.html

步骤

1.安装OpenCV,并找到源码

安装OpenCV就不讲了,源码在安装目录的sources文件夹中

2.运行CMake

进入CMake安装目录,运行/bin/cmake-gui.exe,填写相关参数,包括:OpenCV源码目录OpenCV.sln工程的导出目录

点击Configure

第一次导出时需要设置后面用来编译此OpenCV.sln工程的VS的版本,这里我用的是VS 2017:

注意:这里要不要选Win 64要看你VS下的配置信息,Debug x64 和 Release x64下选择带”Win 64”的选项,Debug win32 和 Release win32选择不带”Win 64”的选项


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


> 划重点:强烈建议去掉BUILD_EXAMPLESBUILD_TESTSBUILD_PERF_TESTS这个三个选项(这三个选项默认勾选),否则静态编译的示例程序非常大。

然后再点击Configure,如果出现红色背景,则表示出错,再Configure,直到不报错就点击Generate就完成了。

3.打开OpenCV.sln,编译生成Debug和Release库

在文件输出目录找到OpenCV.sln,打开,选择编译版本是Debug还是Release,建议两个版本都编译一次。

点击x64旁边的下拉菜单,打开配置管理器,默认情况下,IANSTALL项目是没打勾的,一定记得打上,不然待会配置时怎么都找不到install这个文件夹,也就找不到include,opencv,opencv2。Release(Debug)切换到Debug(Release)模式下,需重新打勾。

选择生成 –> 重新生成解决方案

找到CMakeTargets中的INSTALL,然后右键选择“仅限于项目”–>“仅生成INSTALL”:

4.在Visual Studio中配置生成的OpenCV库文件

项目 –> XX(项目名)属性
要想静态链接,必须要设置"MFC的使用:在静态库中使用MFC""C/C++ --> 代码生成 --> 运行库:/MT(Debug版本为:/MTD)"

Release版本

VC++目录>包含目录:

1
2
3
D:\Su\OpenCV3_4_1\Static\install\include
D:\Su\OpenCV3_4_1\Static\install\include\opencv
D:\Su\OpenCV3_4_1\Static\install\include\opencv2

VC++目录>库目录:

1
D:\Su\OpenCV3_4_1\Static\install\x64\vc15\staticlib

链接器>输入>附加依赖项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
IlmImf.lib
ippicvmt.lib
ippiw.lib
ittnotify.lib
libjasper.lib
libjpeg.lib
libpng.lib
libprotobuf.lib
libtiff.lib
libwebp.lib
opencv_calib3d341.lib
opencv_core341.lib
opencv_dnn341.lib
opencv_features2d341.lib
opencv_flann341.lib
opencv_highgui341.lib
opencv_imgcodecs341.lib
opencv_imgproc341.lib
opencv_ml341.lib
opencv_objdetect341.lib
opencv_photo341.lib
opencv_shape341.lib
opencv_stitching341.lib
opencv_superres341.lib
opencv_video341.lib
opencv_videoio341.lib
opencv_videostab341.lib
zlib.lib

Debug版本

VC++目录>包含目录:

1
2
3
D:\Su\OpenCV3_4_1\Static\install\include
D:\Su\OpenCV3_4_1\Static\install\include\opencv
D:\Su\OpenCV3_4_1\Static\install\include\opencv2

VC++目录>库目录:

1
D:\Su\OpenCV3_4_1\Static\install\x64\vc15\staticlib

链接器>输入>附加依赖项:
(Debug版本带’d’,Release不带)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
IlmImfd.lib
ippicvmt.lib
ippiwd.lib
ittnotifyd.lib
libjasperd.lib
libjpegd.lib
libpngd.lib
libprotobufd.lib
libtiffd.lib
libwebpd.lib
opencv_calib3d341d.lib
opencv_core341d.lib
opencv_dnn341d.lib
opencv_features2d341.lib
opencv_flann341.lib
opencv_highgui341d.lib
opencv_imgcodecs341d.lib
opencv_imgproc341d.lib
opencv_ml341d.lib
opencv_objdetect341d.lib
opencv_photo341d.lib
opencv_shape341d.lib
opencv_stitching341d.lib
opencv_superres341d.lib
opencv_video341d.lib
opencv_videoio341d.lib
opencv_videostab341d.lib
zlibd.lib

调试

调试即可,如果出现:

只需要在附加依赖项第一项中加入nafxcw.lib即可(必须为第一项)

总结

静态链接将库文件加载进exe文件中,虽然增加了exe文件的大小,但是却使exe不需要携带大量的dll运行。

-------------本文结束感谢您的阅读-------------