如何知道 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>]*)
如果找到该模块,它会设置一个<package>_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 找到的包中的库?