【转】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_EXAMPLES,BUILD_TESTS,BUILD_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运行。