VS2015+CMake+opencv4.1+opencv_contrib4.1编译方法及出现的问题

VS2015+CMake+opencv4.1+opencv_contrib4.1编译方法及出现的问题

    • 前言
    • cmake编译
    • 生成解决方案
    • 总结

前言

现希望编译使用opencv扩展模块:opencv_contrib,则采用opencv源码+opencv_contrib源码由CMake共同编译的方法。本文重点讲编译过程中,尤其是生成解决方案过程中VS2015会报告的各种错误。以及解决办法
准备工作:opencv4.1源代码、opencv_contrib4.1源代码、软件cmake(本文使用3.7.0版)、VS2015。

注意这里opencv源码推荐下载windows下的exe程序,再安装(其实本质是解压);而不是github上的源码压缩包zip。

cmake编译

这步骤参考帖子VS2015+Cmake3.8+opencv3.2+opencv-contrib3.2编译及配置步骤、VS2015+opencv4.1.0+contrib+Cmake详细配置方法或者window10 VS2015配置安装opencv_contrib3.2.0+cmake3.11.1。这里不贴图,只简单说一下过程:

  • 首先打开cmake程序,在where is the source code:一栏填入opencv源码的路径,在你的电脑上是这个:.\opencv\sources;在where to build the binaries:一栏填入存放编译结果的路径。注意这第二个路径最好在.\opencv\sources\路径下新建文件夹如.\opencv\sources\newbuild
  • 单击configure按钮,选择visual studio 14 2015 Win64选项,同时勾选本地编辑器Use default native compilers。之后再次单击configure开始构建。出现configuring done说明构建成功。
  • 构建成功后出现很多变量,找到build_opencv_worldopencv_enable_nonfree并勾选。再找到opencv_extra_moduiles_path,填入你下载的opencv_contrib源码中的modules文件夹的路径。
  • 再次单击configure,所有的红色框会变为白色,也可能部分框仍然是红色,那就继续configure,直到所有红色变量变为白色。之后单击Generate开始编译

更细节过程的教程有很多,都是大同小异。这里重点说几点比较常见的问题,需要观察配置过程中输出日志:

  • 在第一次configure的过程中如果报错:"CMake Warning at cmake/OpenCVDownload.cmake:202 (message)"或"CMake Warning at cmake/OpenCVDownload.cmake:193 (message)"等问题是由于国内墙的原因下载不了。有条件的可以对cmake程序使用代理。或者用这个网站下载相应的文件。
  • "错误:find_host_package(PythonInterp 2.7)’ found wrong Python version"类似的与python有关的错误,需要我们添加系统环境变量:桌面“计算机”右键选择“属性”,在弹出“系统”窗口左侧选择“高级系统设置”,弹出“系统属性窗口”。依次选择“高级”>>>“环境变量”,弹出“环境变量”窗口。在系统变量中新建类似下面的变量(变量名不变,变量值需要根据自己python2安装目录确定):
    VS2015+CMake+opencv4.1+opencv_contrib4.1编译方法及出现的问题_第1张图片

生成解决方案

使用cmake的Generate完成之后,在我们的.\opencv\sources\newbuild文件夹内会出现opencv.sln文件,打开(这里有坑,需要用管理员权限打开,方法见下),或者直接在cmake的Generate按键后有一Open project按键,点击即可打开。
打开vs之后,我们可以看到解决方案资源管理器页面中一共有100个项目左右,需要对这些项目都生成解决方案。在菜单栏中找到:生成->生成解决方案。过程比较漫长,并且第一次大概率会有许多项目生成失败。在不同环境下,可能出现的错误报告千奇百怪,这里只能介绍一部分,具体自己实践过程中出现什么错误需要看自己的错误报告,具体解决。我遇到的报错见下:

  • 首先,设置opencv.sln使用管理员权限打开的方法是:在路径C:\Program Files (x86)\Common Files\Microsoft Shared\MSEnv下找到VSLauncher.exe,右键→属性→兼容性→勾选以管理员身份运行;
  • 如果出现类似“LINK : fatal error LNK1181: 无法打开输入文件“opencv_world410”的报错,则需要检查解决方案中opencv_world一项是否生成成功。检查方法就是在解决方案资源管理器中找到opencv_world一项,右键->仅用于项目->仅生成opencv_wolrd,也即重新生成一遍,看看是否能成功。如果生成成功,则没有问题,之后再将所有项目生成一遍即可(这是因为这个文件是后面的项目生成的,但前面的项目就有对它的依赖。所以我们只要之后再对所有项目生成就行了。但千万别点重新生成)。如果没有成功,那需要检查在生成这个项目的过程中的报错:
  • 我这里遇到的错误为:“错误 C2131 表达式的计算结果不是常数”。解决方法:在错误列表中找到该错误行(一般不止一个,随便找一个就行),双击,会自动定位到\gapi\own\mat.hpp文件中的一行,如下:
                #define TABLE_ENTRY(type)  {assign_row, assign_row, assign_row, assign_row}
                static constexpr func_p_t func_tbl[][max_channels] = {
                        TABLE_ENTRY(uchar),
                        TABLE_ENTRY(schar),
                        TABLE_ENTRY(ushort),
                        TABLE_ENTRY(short),
                        TABLE_ENTRY(int),
                        TABLE_ENTRY(float),
                        TABLE_ENTRY(double)
                };
    
    我们需要将static constexpr中的constexpr改为const,再重新编译opencv_world项目以及opencv_world_AVX、opencv_world_AVX2、opencv_world_SSE4_1等项目,来回多试几次。

总结

目前遇到的错误就只有这些,生成解决方案的过程中一定会遇到各种各样的问题,需要对症下药。如果还有解决不了的欢迎评论区讨论。

你可能感兴趣的:(c++,opencv,opencv,c++,vs2015)