cmake - CMake find_path / find_library 是否搜索_ROOT 默认?
问题描述
在阅读有关 CMake 政策 74 - https://cmake.org/cmake/help/latest/policy/CMP0074.html
[...] 现在搜索由 _ROOT CMake 变量和ROOT 环境变量指定的前缀。包根以堆栈形式维护,因此对find 模块和配置包中所有 find * 命令的嵌套调用也将根作为前缀进行搜索。
这是否意味着<PackageName>_ROOT
不需要find_*
明确包含在路径中?这是否意味着<PackageName>_ROOT
将自动检查?
解决方案
是的,但这仅适用于 CMake 3.12 及更高版本,如政策文档中所述:
在 CMake 3.12 及更高版本中,该
find_package(<PackageName>)
命令现在搜索由<PackageName>_ROOT
CMake 变量和<PackageName>_ROOT
环境变量指定的前缀。
这也仅适用find_*
于查找模块和配置包中的命令。
此行为在所有find_*
命令的文档中都有明确说明。例如,这是find_library()
文档中的一个片段(重要部分以粗体显示):
如果
NO_DEFAULT_PATH
不指定,则搜索过程如下:
- 如果从 find 模块或通过调用加载的任何其他脚本中调用
find_package(<PackageName>)
,则搜索当前找到的包所特有的前缀。具体来说,查看<PackageName>_ROOT
CMake 变量和<PackageName>_ROOT
环境变量。包根变量作为堆栈维护,因此如果从嵌套的查找模块或配置包中调用,则将在当前模块或包的路径之后搜索父级查找模块或配置包的根路径。换句话说,搜索顺序将是<CurrentPackage>_ROOT
,ENV{<CurrentPackage>_ROOT}
,<ParentPackage>_ROOT
,等。如果通过或通过设置toENV{<ParentPackage>_ROOT}
可以跳过这一步。NO_PACKAGE_ROOT_PATH
CMAKE_FIND_USE_PACKAGE_ROOT_PATH
FALSE
另请注意,如果使用or调用 find 模块,则该<PackageName>_ROOT
变量将不会用于搜索。NO_DEFAULT_PATH
NO_PACKAGE_ROOT_PATH
推荐阅读
- java - 无法获取 JDBC 连接嵌套异常 SQLException 无法加载身份验证插件“caching_sha2_password”
- java - 使用 Java StringBuilder 的正则表达式
- angular - 角材料一次展开一行并关闭所有其他打开的行
- javascript - 如何在 zeit-now 中连接到 mysql 服务器
- c++ - 为什么在 C++ 中使用向量作为类成员会导致链接错误?
- db2 - 如何在 DB2 中授予或撤销 LIBRARYADMAUTH 权限
- java - 接口可以禁止具有特定数据类型的对象吗?
- java - Akka HTTP 遇到死信
- presto - Presto 是用于存储数据的数据存储吗?
- caching - clflush 指令是否仅从一级缓存中刷新块?