首页 > 解决方案 > cmake 使用通配符作为 find_library NAMES 选项

问题描述

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

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

标签: cmakecmake-languagecmakelists-options

解决方案


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

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

例如,脚本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})

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


推荐阅读