如何知道 CMake 找到的库版本?

Posted

技术标签:

【中文标题】如何知道 CMake 找到的库版本?【英文标题】:How to know version of library found by 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)
....

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

【问题讨论】:

【参考方案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+

【讨论】:

以上是关于如何知道 CMake 找到的库版本?的主要内容,如果未能解决你的问题,请参考以下文章

你如何告诉 CMake 静态链接到使用 find_package 找到的包中的库?

从 CMake 中使用的库继承包含目录

如何知道 CMake 中的“OpenCV”等变量

用于具有单个 .h 文件的库的 Cmake

CMake ExternalProject_Add() 和 FindPackage()

使用 cmake 制作不支持 sse 的库(windows 版本)