如何使用CMAKE中的FIND_软件包请求最佳版本

如何使用CMAKE中的FIND_软件包请求最佳版本,cmake,Cmake,我有一个包含库列表的文件夹: libs\libA-1.0 \libB-1.2 \libB-1.4 \libB-1.6 我在cmake脚本中加载这样的库,例如 FIND_PACKAGE(libB CONFIG) 在本例中,CMAKE只需加载libs文件夹中第一个可接受的版本(在本例中为libB-1.2,因为它是在文件夹中找到的第一个版本) 我知道我可以使用 FIND_PACKAGE(libB 1.6 CONFIG) 但是我想恢复具有最大版本号的库(或者至少是字典顺序

我有一个包含库列表的文件夹:

libs\libA-1.0
    \libB-1.2
    \libB-1.4
    \libB-1.6 
我在cmake脚本中加载这样的库,例如

FIND_PACKAGE(libB CONFIG)
在本例中,CMAKE只需加载libs文件夹中第一个可接受的版本(在本例中为libB-1.2,因为它是在文件夹中找到的第一个版本)

我知道我可以使用

FIND_PACKAGE(libB 1.6 CONFIG)
但是我想恢复具有最大版本号的库(或者至少是字典顺序中的最新版本),而不指定它(这样我就可以在不修改所有cmake脚本的情况下更新库)

这可能吗?

来自:

当多个包配置文件可用时,其版本文件声称与请求的版本兼容,则未指定选择哪一个。未尝试选择最高或最接近的版本号

事实上,如果你认为版本号没有标准,那么猜测什么是“最高或最接近”的版本将是一件痛苦的事情。明确给出你在问题中所写的确切版本是你能做的最好的

如果你真的想要它,你将不得不去设计和提出这个特性。比如:

FIND_PACKAGE(libB latest CONFIG)
这将需要一个替代版本文件来比较版本号。类似于
libB config version compare.cmake的内容包含:

# given two variables to be compared:
# PACKAGE_FIRST_VERSION and PACKAGE_SECOND_VERSION

SET(PACKAGE_LATEST_VERSION ...)
自CMAKE 3.7.0以来

控制find_软件包检查兼容性使用的顺序 两个变量CMAKE_FIND_PACKAGE_SORT_ORDER和 CMAKE\u查找\u包\u排序\u方向。 例如,为了选择可以设置的最高版本:


如果CMAKE能够按自然顺序列出文件夹,可能已经足够了。在这种情况下,99%的时候它会默认得到最新的一个(而不是最旧的)。这并不是那么简单,但这可能是第一个改进。我已经提出并实现了CMAKE的功能:它当前在这里打开。你可以将包添加到你的CMAKE_前缀_路径,顺序是CMAKE将如何检查它们。或者,您可以重复
find_package
调用,并减少版本号。
SET(CMAKE_FIND_PACKAGE_SORT_ORDER NATURAL)
SET(CMAKE_FIND_PACKAGE_SORT_DIRECTION DEC)