cmake为“查找库名称”选项使用通配符

cmake为“查找库名称”选项使用通配符,cmake,cmake-language,cmakelists-options,Cmake,Cmake Language,Cmakelists Options,在cmake中,我们使用find\u library(MyLibrary\u library名称MyLibrary MyLibrary 10 MyLibrary 11 hits/path/to/library)。此命令告诉cmake在提示的每个路径中查找名为mylibrary.so或mylibrary10.so或mylibrary11.so(或windows中后缀为.lib的文件)。如果找到上述任何文件,文件的路径将写入MyLibrary\u LIBRARY变量。但是,由于我使用的一个库经常更新

在cmake中,我们使用
find\u library(MyLibrary\u library名称MyLibrary MyLibrary 10 MyLibrary 11 hits/path/to/library)
。此命令告诉cmake在
提示的每个路径中查找名为
mylibrary.so
mylibrary10.so
mylibrary11.so
(或windows中后缀为
.lib
的文件)。如果找到上述任何文件,文件的路径将写入
MyLibrary\u LIBRARY
变量。但是,由于我使用的一个库经常更新,因此该库很快将重命名为
mylibrary20.so
mylibrary21.so
,因此我需要经常更新cmake脚本以反映更改。我想知道是否有一种方法可以在这里使用通配符,这样cmake就会自动找到
mylibraryXX。所以这里的
XX
表示两位数字


根据文档(),这似乎不受支持。如果是这样的话,还有其他的解决办法吗?(创建从
mylibraryXX.so
mylibrary.so
的链接对我来说不太有效,因为我无法控制库。)

find_库
和其他
find_*
命令中不支持通配符

如果库的名称不是固定的,则在
names
选项中枚举所有可能的名称是正常的

例如,脚本在一个变量中收集Boost的所有已知版本:

set(_Boost_KNOWN_VERSIONS ${Boost_ADDITIONAL_VERSIONS}
    "1.74.0" "1.74"
    "1.73.0" "1.73" "1.72.0" "1.72" "1.71.0" "1.71" "1.70.0" "1.70" "1.69.0" "1.69"
    "1.68.0" "1.68" "1.67.0" "1.67" "1.66.0" "1.66" "1.65.1" "1.65.0" "1.65"
    # ...
    "1.34" "1.33.1" "1.33.0" "1.33")
并通过迭代此变量创建可能的库名称列表

请注意,虽然已知版本的列表是硬编码的,
FindBoost.cmake
允许(通过
Boost\u ADDITIONAL\u versions
变量)用户指定脚本编写时未知的其他版本

要创建具有两位数版本后缀的可能库名称列表,可以使用循环:


请注意,更改库名通常意味着某些不兼容,因此盲目地迭代库的所有可能版本可能会导致程序无法按预期工作。

这是一个非常好的答案。谢谢
set(mylibrary_names)
foreach(ver RANGE 11 99)
  list(APPEND mylibrary_names mylibrary${ver})
endforeach()

find_library(MyLibrary_LIBRARY NAMES ${mylibrary_names})