cmake 对 find_library NAMES 选项使用通配符

cmake use wildcard for find_library NAMES option

在cmake中找到我们使用的库find_library(MyLibrary_LIBRARY NAMES mylibrary mylibrary10 mylibrary11 HINTS /path/to/library)。此命令告诉 cmake 在每个路径 HINTS.如果找到上述任何文件,文件的路径将写入 MyLibrary_LIBRARY 变量。但是,由于我正在使用的库之一经常更新 - 因此该库将很快重命名为 mylibrary20.somylibrary21.so - 我需要经常更新 cmake 脚本以反映更改。我想知道是否有一种方法可以在这里使用通配符,这样cmake会自动在这里找到mylibraryXX.so,其中XX表示两位数。

根据文档 (https://cmake.org/cmake/help/latest/command/find_library.html),这似乎不受支持。如果是这样,是否还有其他解决方法? (创建从 mylibraryXX.somylibrary.so 的 link 对我来说不太管用,因为我无法控制库。)

find_library 和其他 find_* 命令不支持通配符。

如果库的名称不固定,那么在NAMES选项中枚举所有可能的名称是正常的。

例如,脚本 FindBoost.cmake 将所有已知版本的 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_ADDITIONAL_VERSIONS 变量)用户指定其他版本,这些版本可能不为脚本所知写的时间。

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

set(mylibrary_names)
foreach(ver RANGE 11 99)
  list(APPEND mylibrary_names mylibrary${ver})
endforeach()

find_library(MyLibrary_LIBRARY NAMES ${mylibrary_names})

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