CMake+VS2015+Opencv2.4.13生成Release详解

0 引言
本篇文章旨在解决利用VS IDE与Opencv生成Release版本的问题,可在一台没有安装各种库和IDE的电脑上直接运行。虽然百度一搜有很多类似的帖子,但都大同小异,而且基本都是主要写Debug版本生成,到了Release版本是只是一带而过,难免有些关键问题没有讲的很明确(当然,可能是这些博主本身具有一定的开发经验)。在我个人实践过程中仍然遇到了一些问题。为了防止后续做开发的人员少走弯路,本帖把完整的实现过程进行了总结,并针对几个我遇到的关键问题进行讨论,希望给他人以参考。

那么,关于这几个编辑器和库的版本问题,我的选择是cmake-3.14.6-win64-x64、Opencv2.4.13和VS2015。其实在最初接触的时候可能对这些版本没有什么概念,有些人喜欢最新发布的版本,但在这里我不建议用最新的版本,而是建议选择稳定的和自己所习惯的。版本的选择不同,可能导致最后的成功与失败,这是我深有体会的,这里不建议大家选择Opencv2.4.9,原因在正文中会提到。

1 正文

1.1 核心概念

(1)静态库(.lib)

函数和数据被编译进一个二进制文件(通常扩展名为.LIB)。在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其他模块组合起来创建最终的可执行文件(.EXE文件)。当发布产品时,只需要发布这个可执行文件,并不需要发布被使用的静态库。

(2)动态库(.lib文件和.dll文件)

在使用动态库的时候,编译后往往提供两个文件:一个引入库(.lib)文件(也称“导入库文件”)和一个DLL(.dll)文件。

(3) 二者的区别

从直观上来看,静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了,最终的可执行文件exe会比较大。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。

静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。静态链接库运行之前就加载了,而且一直存在直到关闭程序,动态DLL实在运行时再加载,不用一直占内存,dll模块内部更改了,是要替换Dll即可,方便维护。优点明显,但是dll如果丢失或被误删,就无法运行了。

知道了这些概念之后,想必也知道要想得到Release版本且不依赖dll的exe文件是需要依靠static lib的。下面就直接来看具体的操作步骤吧。

1.2 生成Release版本的步骤详解

在Opencv2.4.13版本下载之后,首先要确定 D(你的安装目录):…\2.4.13\build\x86\vc12文件夹中包含的内容,如下图所示。如果有staticlib,那么恭喜你可以直接用这个文件夹中编译好的静态lib了。
在这里插入图片描述
如果没有该文件夹,也不要慌,只需要下载CMake进行重新编译生成它就可以了。当然,不论是否有这个文件夹我的建议还是使用CMake重新编译生成staticlib文件夹,其目的是为了后面对源码进行修改时不影响这个原始版本(对新手而言,对于很熟练的老手来说其实无所谓了)。

CMake的下载链接为:cmake
Opencv的下载链接为:Opencv

下载好CMake之后进行解压即可,如下图
在这里插入图片描述
双击进入文件夹找到bin里面的cmake-gui并运行
在这里插入图片描述
接下来会看到CMake的GUI界面
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190921110923853.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2Mjk3NzEy,size_16,color_FFFFFF,t_70

在这里插入图片描述

其中1号对应的为你的Opencv安装的目录中的sources,2号为进行编译后文件的存放位置,自己选择就好。点击Configure和Yes

在这里插入图片描述
接来下根据VS版本进行对应的选择,点击Finish进行第一次编译。
在这里插入图片描述
编译过程会显示如下界面

在这里插入图片描述
第一次编译后的界面为,找到其中的BUILD_SHARED_LIBS把对勾取消(!!!注意),因为我们是要得到最后的static lib。这个操作很重要,直接影响后面配置的结果,注意。

在这里插入图片描述
然后,继续点击Configure进行二次生成。完成之后,直接点Generate即可完成,关闭CMake。
在这里插入图片描述
接下来,到你的创建目录中去找一下刚才生成的文件,这里我的电脑中是去寻找new_build2
在这里插入图片描述
打开该文件夹,双击Opencv的解决方案
在这里插入图片描述
选择Release,然后右键

在这里插入图片描述
编译需要一定的时间,取决于电脑的性能,完成之后输出栏会显示
在这里插入图片描述
接下来右键INSTALL生成
在这里插入图片描述
在这里插入图片描述
该操作完成后,即将生成的lib(动态库的话就是dll和lib)和头文件都整合到一起,放在了你刚才打开OpenCV.sln这个目录下的install文件夹内:
在这里插入图片描述
双击进入install文件夹中的x86

在这里插入图片描述
这里对应的说明一下在引言中提到的不建议使用Opencv2.4.9的原因:经过多次的实验,我下载的2.4.9在编译完成后install文件夹中不存在x86文件夹,当然不排除别的官网release版本也可能会出现这个结果,需要特别注意。

正确的生成后会在D:…\install\x86\vc14看到编译成功的static lib
在这里插入图片描述
至此编译部分完成,下面进入环境的配置阶段。

1.3 在VS2015中配置Opencv
这里的配置是用到1.2节中编译后staticlib的,具体步骤如下:
首先我们新建一个工程,这里我就以毛星云那本Opencv3编程入门中调用笔记本自带摄像头的例子来进行说明。

第二步,将对应的程序敲进去,这里直接贴出来供大家复制:
头文件1.h中的代码

#pragma once
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

主程序代码

#pragma once
#include "1.h"
#pragma comment(lib, "vfw32")
int main(int argc, char **argv[])
{
	VideoCapture capture(0);
	Mat edg;
	while (1)
	{
		Mat frame;
		capture >> frame;

		cvtColor(frame, edg, CV_BGR2GRAY);
		blur(edg, edg, Size(7, 7));
		Canny(edg, edg, 0, 30, 3);
		imshow("啊哈哈", edg);
		if (waitKey(30) >= 0)break;
	}
	waitKey(0);
	return 0;
}

此时我们看一下属性表,在未添加库文件和包含路径之前,主程序中全是语法错误,那么下一步将属性表进行添加与配置。(当然,在实际写程序时还是最好添加属性表)
在这里插入图片描述
右键Release|Win32,添加新属性表,并命名如下
在这里插入图片描述
双击进入属性表的配置界面:
在这里插入图片描述
在VC++目录中的包含目录里添加:

D:\...\2.4.13\build\include
D:\...\2.4.13\build\include\opencv
D:\...\2.4.13\build\include\opencv2

注意,我这里的包含目录用的是下载Opencv2.4.13后解压目录里的,当然你也可以用CMake编译后的包含目录,这两种都可以看自己的喜好进行选择:

D:\...\new_build2\install\include
D:\...\new_build2\install\include\opencv
D:\...\new_build2\install\include\opencv2

在库目录添加:(该步骤至关重要,一定是CMake编译后的staticlib,static!!!否则无法脱离自己的电脑运行)

D:\...\new_build\install\x86\vc14\staticlib

接下来在C/C++菜单项选择代码生成,选择多线程MT
在这里插入图片描述
再到链接器项-》附加依赖项添加lib文件,注意这里的lib文件区别与Debug模式下,是没有后缀…d.lib的。
在这里插入图片描述

IlmImf.lib
libjasper.lib
libjpeg.lib
libpng.lib
libtiff.lib
opencv_calib3d2413.lib
opencv_contrib2413.lib
opencv_core2413.lib
opencv_features2d2413.lib
opencv_flann2413.lib
opencv_gpu2413.lib
opencv_highgui2413.lib
opencv_imgproc2413.lib
opencv_legacy2413.lib
opencv_ml2413.lib
opencv_nonfree2413.lib
opencv_objdetect2413.lib
opencv_ocl2413.lib
opencv_photo2413.lib
opencv_stitching2413.lib
opencv_superres2413.lib
opencv_ts2413.lib
opencv_video2413.lib
opencv_videostab2413.lib
zlib.lib

记得要在从父…继承打对勾
在这里插入图片描述
至此Release模式下的配置属性表已经完成。那么,配置前红色语法错误的地方全部变绿:
在这里插入图片描述
运行程序,成功。
在这里插入图片描述

问题的讨论:列出几个我第一次操作时出现的问题
1.error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MTd_StaticRelease”不匹配值“MDd_DynamicRelease
出现该问题的原因是属性表中的几个选项不对应而导致的,建议参看这位博主写的帖子
解决LNK2038的方法

2.属性表的配置方法,参看
Opencv属性表配置

3.属性表的位置发生了更改导致的项目加载失败。如果你的属性表刚开始乱放的话,比如我,当时配置成功了,过了一段时间再打开同样的项目可能出现下面的错误。此时,就是因为当时配置好的属性表被你移动到别的文件夹了。网上有很多解决办法,但是我觉得都太复杂。那么,我的建议是1:如果你知道配置好的属性表的位置,那么很好,直接将它复制到输出栏下面提示的这个路径中;2:如果不记得当时配好的属性表在哪,不要慌,直接打开新项目,新建属性表,改为输出栏中相同的名字,并存放在相同位置,那么这个加载失败的错误就会消失,主程序会被成功加载。之后进入主程序后,再依照本贴重新配置一遍属性表即可。
在这里插入图片描述
我的建议是,不同版本opencv或与不同应用程序开发框架如MFC或 QT使用时,最好都重新配置一遍,然后命名以便区分,比如我的:
在这里插入图片描述
4.上图中的ImageWatch建议大家使用,真的是调试神器,可以讲复杂的VS编译变成有点类似Matlab中间的调试过程,可以大大减少Debug的时间。
Imagewatch下载链接
下载后双击安装,也就几秒时间,重启VS到视图中进行添加:
在这里插入图片描述

至此,本帖完成,周末写的,写完去耍了,可能会有错误,但主要步骤肯定是正确的,欢迎大家留言吐槽,共同进步。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
VS2015 是微软公司开发的一款集成开发环境(IDE),用于开发各种类型的应用程序。CMake 是一个跨平台的构建系统,可以自动生成与平台相关的构建脚本。OpenCV 是一个计算机视觉库,提供了一系列的图像处理和计算机视觉算法。 在VS2015中使用CMake来构建OpenCV项目,需要按照以下步骤进行操作: 1. 首先,确保已经安装了VS2015CMake,并将它们正确配置好。 2. 下载OpenCV的最新版本,可以从官方网站或GitHub上获取。 3. 创建一个新的文件夹作为OpenCV项目的根目录,例如"OpenCVProject"。 4. 打开CMake,并设置源码路径为刚创建的OpenCV项目根目录。 5. 设置构建路径,可以选择将构建文件输出到根目录或单独的"build"文件夹。 6. 点击"Configure"按钮,CMake将开始配置项目。 7. 在配置过程中,可以选择需要启用的功能、库和模块。根据需要选择或取消相应的选项,并确保路径正确。 8. 配置完成后,点击"Generate"按钮,CMake生成VS2015的解决方案文件和项目文件。 9. 打开生成的解决方案文件(.sln),在VS2015中加载该解决方案。 10. 在VS2015中,可以对项目进行编译、调试和运行。 通过这些步骤,我们就可以在VS2015中使用CMake来构建OpenCV项目。这样可以方便地管理和控制项目的编译过程,同时也能够使用OpenCV提供的丰富功能和算法来开发图像处理和计算机视觉应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值