简介:cmakes是生成跨平台工程的工具,比如可以为工程生成.sln文件在Visual Studio上打开,也可以生成.pro文件在QtCreator上打开。
日常用到OpenCV时,进行调用API时,选择定义时,只定义到头部文件.hpp
,无法查看源码,因此在此利用cmake
对OpenCV中的source
文件进行编译成.sln
解决方案
参考:OpenCV编程入门-2.2 开源的魅力:编译OpenCV源代码
CMake,是“crossplatform make”的缩写,它是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CmakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是CMake 和 SCons 等其他类似系统的区别之处
下载地址:https://cmake.org/download/
打开后如图,点击红框内文件下载
双击安装
添加环境变量
安装路径,修改为自己的
安装成功后进行,在使用前需要重启计算机(让添加环境变量生效)
win+r 进入cmd 命令窗口 输入“cmake”显示出如下信息,则表明安装成功
其实我们可以发现,此指定安装路径下必须会有一个名为CMakeLists.txt的文件。
这个文件就是给cmake留下的配置文件,cmake可以根据这个配置文件,通过不同的编译器选择,来生成不同的解决方案,VisualStudio的编译器对应的就生成Visual Studio版的sln解决方案。
Ps:在此路径下切记不能出现中文,否则会出现一些不知名的错误
如图,第一次点击Configure按钮:
会弹出如下进行编译器选择的对话框:
首先选定Use default native compilers
,然后,我们可以发现下拉列表中提供了几十种编译器给我们选择,因为我们安装了Visual Studio,会默认为我们选择好对应版本的Visual Studio编译器,比如Visual Studio 19(即待会儿会生成对应VS2019的sln解决方案)
确认无误后,单击finish
按钮。
于是,cmake开始第一次源代码配置过程:
出现错误,CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
,原因可能如下
source
库因cmake版本是最新的,所以用OpenCV较新的版本4.1版本,改过后cmake中的设置:
解决: 是pyconfig,h 的配置问题,以 pyconfig.h (本电脑路径C:\Users\HASEE\AppData\Local\Programs\Python\Python36\include)为例,在第 338 行的语句:
pragma comment(lib,”python36_d.lib”)
对如下地方
在对应的 pyconfig.h 文件中做出如下修改:
并且要将 define Py_DEBUG(338 句)注销:
然后configure,就可以通过了!
参考:
无法打开 python36_d.lib 的问题
LNK1104 无法打开文件“python37_d.lib” 解决办法
一般两次configure就行了,直到没有红色,像第一次configure一样。
在cmake-gui完成Generate后,"Open Project"就由灰色变为可选了,右击就使用之前配置的vs2019来打开编译(可以根据需要编译,如编译Release和Debug版):
出错:error MSB307: 命令“setlocal
解决:
1、在打开的opencv.sln,分别在Debug X64 和release X64下直接生成解决方案
2、在CMakeTargets下的INSTALL右键选择生成;此时,在opencv4.1下面的newbuild中生成一个install文件夹,配置完毕。
新建c++空项目,添加并配置项目属性表(之后编译器也要在debug X64下运行 ):
添加包含目录:
添加库目录:
添加附加依赖项:
测试代码1(测试opencv):
#include
#include
using namespace std;
using namespace cv;
int main()
{
String winname = "Image Window";
//当前目录中添加一个名称为"color_wheel.jpg的图片文件"
//指定图片来源和名称要和实际对应, 注意“/”
Mat image = imread("F:/images/1.jpg");
if (image.data == NULL)
{
cerr << "错误: 没找到文件。" << endl;
}
else
{
//指定图片显示器的标题名称
imshow(winname, image);
}
//等待按键操作,避免闪退
waitKey(0);
return 0;
}
运行后出错,显示错误: 没找到文件
原因:配置“链接器->附加依赖项”时,把*.lib库一起加入其中,并且将.lib
库加在了d.lib
库之前,这样就导致了优先使用.lib
。解决:是把附加依赖项中open的.lib
全删了。
注意:一般在配置工程时,Debug工程的“链接器->附加依赖项”一般只加d.lib
库;而Release工程的“链接器->附加依赖项”一般只加.lib
库,这样就可以避免以上问题。
参考链接:
OpenCV imread读取图片失败解决方法
测试代码2(测试contrib):
#include
#include
#include
using namespace std;
using namespace cv;
using namespace face;
int main()
{
Ptr<FaceRecognizer> model;
waitKey(0);
return 0;
}
编译测试代码成功,则表示新opencv库和contrib库编译成功
opencv4.1.0,visual studio 2019,cmake 3.14.3配置
(win10 + vs2019) cmake编译 (opencv4.1.0 + opencv_contrib4.1.0)