【问题标题】:How to know version of library found by CMake?如何知道 CMake 找到的库版本?
【发布时间】:2015-12-07 16:51:30
【问题描述】:

我目前正在开发一个使用 CMake 文件和 OpenCV 以及其他库的 C++ 项目。我的目标是能够使用 2.4.something 和 3.0 版本编译我的代码。

为了做到这一点,我想到了使用 CMake 配置来设置一个变量,指示在配置阶段找到的 OpenCV 包的版本是否大于或等于 3.0。使用这个变量,我可以包含或排除我的代码的临时部分。

但是我无法在任何地方找到如何在 CMake 文件中知道找到的包的版本。

我的 CMake 文件的伪代码如下所示:

....
find_package(OpenCV 2.4 REQUIRED)
if(OpenCV_Version >= 3)
    set (OpenCV_3 1)
else
    set (OpenCV_3 0)
endif(OpenCV_Version)
....

可以这样做还是我做错了什么?

【问题讨论】:

    标签: c++ opencv cmake


    【解决方案1】:

    来自find_package 上的 CMake 文档:

    If the version is acceptable the following variables are set:
    
    <package>_VERSION
        full provided version string
    <package>_VERSION_MAJOR
        major version if provided, else 0
    <package>_VERSION_MINOR
        minor version if provided, else 0
    <package>_VERSION_PATCH
        patch version if provided, else 0
    <package>_VERSION_TWEAK
        tweak version if provided, else 0
    <package>_VERSION_COUNT
        number of version components, 0 to 4
    

    您可以将变量OpenCV_VERSION 与完整版本字符串一起使用,以使用if() 命令的VERSION_* 模式进行比较:

    if(OpenCV_VERSION VERSION_LESS "3.0")
        # 2.4 version
    else()
        # 3.0 version
    endif()
    

    或带有数字比较的版本组件变量:

    if(OpenCV_VERSION_MAJOR LESS 3)
        # 2.4 version
    else()
        # 3.0 version
    endif()
    

    【讨论】:

    • Here 是更多条件,例如 e。 G。 VERSION_GREATER_EQUAL.
    【解决方案2】:

    OpenCV 为此提供了一个内置常量:

    CV_MAJOR_VERSION

    使用此常量,您可以轻松编写版本相关代码。

    #if CV_MAJOR_VERSION >= 3
        //OpenCV 3.x code
    #else
        //OpenCV 2.4.x code
    #endif
    

    【讨论】:

      【解决方案3】:

      如果你使用FindPkgConfig,你也可以使用它的pkg_search_module 命令。

      pkg_search_module(<PREFIX> [REQUIRED] [QUIET]
                        [NO_CMAKE_PATH] [NO_CMAKE_ENVIRONMENT_PATH]
                        <MODULE> [<MODULE>]*)
      

      如果找到该模块,它会设置一个&lt;package&gt;_VERSION 变量。

      include(FindPkgConfig)
      
      pkg_search_module(OPENCV    REQUIRED    opencv)
      
      message(STATUS "Got OpenCV ${OPENCV_VERSION}")
      if (${OPENCV_VERSION} VERSION_GREATER_EQUAL "3.0.0")
          message(STATUS "Got OpenCV 3+")
      else()
          message(STATUS "Got OpenCV <3")
      endif()
      

      打印出这样的内容:

      -- Checking for one of the modules 'opencv'
      -- Got OpenCV 3.2.0
      -- Got OpenCV 3+
      

      【讨论】:

        猜你喜欢
        • 2015-10-08
        • 1970-01-01
        • 1970-01-01
        • 2015-10-22
        • 1970-01-01
        • 2015-07-12
        • 2016-02-27
        • 1970-01-01
        • 2015-11-27
        相关资源
        最近更新 更多