cmake - 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.so
或mylibrary21.so
——我需要经常更新 cmake 脚本以反映更改。我想知道是否有一种方法可以在这里使用通配符,以便 cmake 会自动在mylibraryXX.so
这里找到,这XX
意味着两位数。
根据文档(https://cmake.org/cmake/help/latest/command/find_library.html),这似乎不受支持。如果是这种情况,是否还有其他解决方法?(创建从mylibraryXX.so
to的链接mylibrary.so
对我来说不太有效,因为我无法控制库。)
解决方案
find_library
和其他find_*
命令不支持通配符。
如果库的名称不固定,那么在NAMES
option 中枚举所有可能的名称是正常的。
例如,脚本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})
请注意,更改库名称通常意味着某些不兼容,因此盲目地迭代所有几乎可能的库版本可能会导致您的程序无法按预期工作。
推荐阅读
- c - 在 malloc 的返回值类型周围添加括号
- artifactory - Artifactory 和 Xray 可以使用通用的 RDS PostgreSQL 实例吗?
- mysql - mysql 安装损坏,导致 mysql 无法卸载
- javascript - 从 html 中的 app.js 调用函数时函数未定义和错误
- installation - 排查 Debian Preseed Late_command
- f# - 如何在不将结果传递给 F# 中的调用者的情况下捕获特定类型的异常?
- python - Python/Panda 字符串拆分 - 保留拆分器(分隔符)
- arrays - 下标值不是指针、数组,也不是向量,只是两个基本数组,
- regex - 用于解析逻辑表达式的正则表达式
- android - 在购买的源代码上没有“生成签名包/apk”选项