为什么CLion不将我的项目与OpenCV for Windows链接?

时间:2016-10-06 15:43:00

标签: opencv cmake clion

我正在尝试使用OpenCV for Windows提供的opencv.org在我正在使用JetBrains' CLion IDE构建的项目中。我已经安装了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下工作?

1 个答案:

答案 0 :(得分:5)

简短的回答是,您可能需要从源代码构建OpenCV才能将其用于CLion 。但鉴于此处*和其他地方使用JetBrains' CLion IDEthe OpenCV library使用部分答案和未答复问题的数量和范围,我认为需要概述(我的说明来自CLion 2016.3和OpenCV 3.1,YMMV):

  • 虽然不是由JetBrains制作的,但CMake对于CLion的运作至关重要。因此,了解CMake有助于诊断CLion构建问题。特别是CMake维护设置的磁盘“缓存”,您可能需要清除这些设置以将更改合并到您的环境中(工具 - > CMake->重置缓存和重新加载项目)。
  • 要在构建中使用 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 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.cmake OpenCV_DIR (请参阅上面的上一点)来查找名为 OpenCVConfig.cmake的文件。此文件由特定版本的OpenCV生成并附带,以记录存在的组件及其所在位置。

  • 当OpenCVConfig.cmake使用的变量名与CLion存储在其环境中的变量名 时,可能会出现问题。特别是,如果您的OpenCV是由Microsoft Visual C( MSVC )构建的,那么the Windows distribution from opencv.org也是如此,它将无法与CLion一起使用。

    因为CLion的构建工具链( Control Alt S -toolchain)使用MinGW或Cygwin,所以 OpenCVConfig.cmake 将在名为 mingw cygwin 的子目录下搜索OpenCV二进制文件,并且将找不到 ,因为二进制文件已构建使用MSVC(它将在 vc11 vc12 等目录中查找)。这可能意味着 您需要从源代码构建OpenCV才能将其用于CLion

    重新配置OpenCVConfig.cmake指向MSVC二进制文件可以使这个工作吗?你可能会问。不幸的是答案仍然没有,因为libraries built with one compiler typically cannot be linked with another one

  • OpenCVConfig.cmake FindOpenCV.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 兼容性问题提供了一些一般性指导。请注意,这不包括编译器链接器问题;直到 CMake 完成其初始makefile构建才会出现这些内容。编译器或链接器问题在稍后阶段发生,并由include*()link*() CMakeLists.txt 中的其他命令控制。

*一些相关的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?