【问题标题】:Error configuring OpenCV project with CMake on Windows在 Windows 上使用 CMake 配置 OpenCV 项目时出错
【发布时间】:2015-08-11 00:39:34
【问题描述】:

我使用了预构建的 OpenCV 3.0.0 版本。当我直接创建 Visual Studio 项目以及添加包含和库目录时,它可以工作。

现在我正在制作一个 CMakeList.txt 文件(这样我就可以在不同的系统上运行相同的代码)。它将用于在 Windows 上创建 Visual Studio 项目,在 Unix 上创建 Makefile 等。

cmake_minimum_required(VERSION 2.8)
project( Facade )
find_package( OpenCV REQUIRED )
add_executable( Facade grammar.cpp )
target_link_libraries( Facade ${OpenCV_LIBS} )

当我在 Windows 上生成 Visual Studio 文件时,出现以下错误:

CMake Warning at C:/opencv/build/OpenCVConfig.cmake:166 (message):
  Found OpenCV Windows Pack but it has no binaries compatible with your
  configuration.

  You should manually point CMake variable OpenCV_DIR to your build of OpenCV
  library.
Call Stack (most recent call first):
  CMakeLists.txt:3 (find_package)


CMake Error at CMakeLists.txt:3 (find_package):
  Found package configuration file:

    C:/opencv/build/OpenCVConfig.cmake

  but it set OpenCV_FOUND to FALSE so package "OpenCV" is considered to be
  NOT FOUND.

目前,OpenCV_DIR 是 C:\opencv\build,它保存 CMake 文件。如果我将 OpenCV_DIR 指向 C:\opencv\build\x64\vc12,它会说,找不到 CMake 文件。

我该如何解决这个问题?

【问题讨论】:

    标签: opencv cmake


    【解决方案1】:

    您在 CMake 配置步骤中使用了什么生成器字符串?对于 VC12 x64,您需要使用 -G "Visual Studio 12 Win64"(如果您使用的是 CMake 3,您将使用 -G "Visual Studio 12 2013 Win64")。请注意,您需要在末尾包含 Win64 才能获得 x64 平台。

    OpenCV CMake 配置脚本正在检查以确保您使用的是 x64 二进制文件,这非常方便。您将 CMake 配置为构建 32 位二进制文​​件,如果您能够构建可执行文件,则会导致运行时错误。

    【讨论】:

    • 我用的是 Visual Studio 14 2015 Win64。
    • 这正是问题所在。 cmake 正在查找 C:\opencv\build\x64\vc12,这意味着 cmake 工件适用于 vc12 构建的 x64 平台。因此,您要么需要在我的答案中使用生成器字符串,要么自己使用 vc14 构建 OpenCV。已发布的 opencv 3 预构建二进制文件适用于 vc11 或 vc12 而不是 vc14。
    • 啊,我明白了!谢谢!
    • 是的,在 Linux/gcc 世界中,您可以从多个 gcc 版本中获得与 ABI 兼容的工件。 Visual Studio 并非如此——至少不容易。将每个 VS 版本视为一个新平台,事情就容易多了。这就是为什么我说 OpenCV cmake 配置脚本帮了你一个忙,不允许你针对不兼容的二进制文件进行构建。与运行时崩溃相比,跟踪构建错误要容易得多。
    【解决方案2】:

    以防万一其他人有这个问题,我是通过使用旧的 CMake 配置脚本得到的。安装了 VS2017 后,我收到了这个错误——原来一些自动生成的 CMAKE 配置有这样的东西:

    elseif(MSVC_VERSION EQUAL 1910)
        set(OpenCV_RUNTIME vc15)
    

    我检查了 MSVC_VERSION,它是 1916,它仍然是 VC15,但文件错误地错过了它。我改为:

    elseif((MSVC_VERSION EQUAL 1910) OR (MSVC_VERSION GREATER 1910))
        set(OpenCV_RUNTIME vc15)
    

    它就像一个魅力。

    【讨论】:

      猜你喜欢
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 2016-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      相关资源
      最近更新 更多