【问题标题】:Why doesn't CLion link my project with OpenCV for Windows?为什么 CLion 不将我的项目与 OpenCV for Windows 链接?
【发布时间】:2017-02-15 10:54:56
【问题描述】:

我正在尝试在使用JetBrains' CLion IDE 构建的项目中使用opencv.org 提供的OpenCV for Windows。我已经安装了 opencv 库并配置了 CLion (set(OpenCV_DIR) 以引用它下面的 build 目录,但是 CMake 发出警告:

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.

我已经尝试了一些来自 opencv.org 的旧发行版,结果相同。看起来 CMake 正在定位 OpenCV 库,但不想使用它们。为什么以及如何让 OpenCV 库在 CLion 下工作?

【问题讨论】:

标签: opencv cmake clion


【解决方案1】:

简短的回答是,您可能需要从源代码构建 OpenCV 才能与 CLion 一起使用。但是考虑到这里*和其他地方关于使用 JetBrains' CLion IDEthe OpenCV library 的部分回答和未回答问题的数量和范围,我认为需要进行概述(我的笔记来自 CLion 2016.3 和 OpenCV 3.1,YMMV):

  • 尽管不是由 JetBrains 生产,CMake 是 CLion 运营的核心。因此,了解 CMake 有助于诊断 CLion 构建问题。特别是 CMake 维护一个磁盘“缓存”设置,您可能需要清除这些设置以将更改合并到您的环境中(Tools->CMake->Reset Cache and Reload Project)。
  • 要在您的构建中使用 OpenCV,您必须在项目的 CMakeLists.txt 文件中指定它。您请求 CMake 找到您的 OpenCV 位置并将其链接到您的 TARGET。下面是来自CMakeLists.txt 的用于名为mushroom 的可执行文件的命令序列示例: add_executable(mushroom ${SOURCE_FILES}) FIND_PACKAGE(OpenCV REQUIRED) TARGET_LINK_LIBRARIES(mushroom ${OpenCV_LIBS})

    (有关FIND_PACKAGE 的更多信息,请参阅CMake:How To Find Libraries。)

  • FIND_PACKAGE for package XXX 可以通过位于 CMake 的Modules 目录中的 FindXXX.cmake 文件或通过咨询环境变量 XXXX_DIR。在我的系统上,没有 FindOpenCV.cmake 文件,所以我改用 OpenCV_DIR 环境变量。这必须设置,不是设置到您的 OpenCV 安装的根目录,而是设置到它下面的 build 文件夹。我在 CMakeLists.txt 中使用了一个条目来设置这个变量,例如:

    set(OpenCV_DIR C:/Users/myacct/AppData/Local/opencv-3.0.0/build)
  • 为了与 OpenCV 链接,CMake 使用 FindOpenCV.cmakeOpenCV_DIR(请参阅上面的前一点)来定位名为 OpenCVConfig.cmake 。该文件由特定版本的 OpenCV 生成并随其一起提供,以记录存在的组件以及它们的位置。

  • 当 OpenCVConfig.cmake 使用的变量名与其环境中存储的 CLion 冲突时,可能会出现问题。特别是,如果您的 OpenCV 是由 Microsoft Visual C (MSVC) 构建的,就像 the Windows distribution from opencv.org 一样,它不适用于 CLion。

    由于 CLion 的构建工具链(ControlAltS-toolchain)使用 MinGW 或 Cygwin,OpenCVConfig.cmake 将在名为 mingwcygwin 的子目录下搜索 OpenCV 二进制文件,但将找不到任何,因为二进制文件已构建使用 MSVC(它将在 vc11vc12 之类的目录中查找)。这可能意味着您需要从源代码构建 OpenCV 才能与 CLion 一起使用

    将 OpenCVConfig.cmake 重新配置为指向 MSVC 二进制文件是否可以实现这一点?您可能会问。不幸的是,答案仍然是否定的,因为libraries built with one compiler typically cannot be linked with another one

  • OpenCVConfig.cmakeFindOpenCV.cmake 可能包含诊断消息,但当 CLion 为您执行 CMake 时,不会显示 message(STATUS) 调用。要使它们显示,请将它们更改为 message(WARNING)message(FATAL_ERROR)但是 CLion 2016.3 EAP 解决了这个问题;见https://stackoverflow.com/a/39398373/5025060

  • CLion 不指示哪个 .cmake 脚本发出了哪个诊断;不要假设它们都来自同一个脚本。

希望这能为解决 CLion / CMake / OpenCV 兼容性问题提供一些一般性指导。请注意,这不包括 compilerlinker 问题;在 CMake 完成其初始 makefile 构建之前,这些不会出现。编译器或链接器问题发生在稍后阶段,由 CMakeLists.txt 中的include*()link*() 和其他命令控制。

*一些相关的 SO 问题:
OpenCV Windows setup with CLion
OpenCV CLion (Cmake) linking issue - cmake reports a strange error
use OpenCV with Clion IDE on Windows
Compiling OpenCV on Windows with MinGW
Could not find module FindOpenCV.cmake ( Error in configuration process)
CMake: Of what use is find_package() if you need to specify CMAKE_MODULE_PATH anyway?

【讨论】:

  • Clion 现在支持 MSVC 工具链,如果我按照本指南 jamesbowley.co.uk/… 将 clion 与 MSVC 工具链一起用于 opencv 构建,它会起作用吗?
  • @SaintTail,抱歉,我不知道您的问题的答案,但感谢您向我们提供有关 CLion 更改的最新信息。 特别是 @987654335 处的信息@ 表示我在这个答案中描述的一些问题正在得到解决,例如:CMake 与 CLion 的解耦过程已经开始......如果你确实让 CLion 像你描述的那样工作,请让我们知道这里!
  • 它正在工作!我使用 msvc 工具链成功地使它工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-14
  • 2012-05-29
  • 2021-05-30
  • 2011-10-20
  • 2020-01-26
  • 2018-04-07
相关资源
最近更新 更多