cmake:指定find_package的搜索路径
find_package
找到外部项目,并加载其设置。
基本签名和模块模式
find_package(<PackageName> [version] [EXACT] [QUIET] [MODULE][REQUIRED] [[COMPONENTS] [components...]][OPTIONAL_COMPONENTS components...][NO_POLICY_SCOPE])
从外部项目查找并加载设置。
- < PackageName >_FOUND将被设置为指示是否找到了包。当找到包时,特定于包的信息会通过包本身记录的变量和Imported Targets提供。
- QUIET选项禁用信息消息,包括那些表示如果包不是REQUIRED则无法找到它的消息。如果找不到包,REQUIRED选项将停止处理,并显示一条错误消息。
- QUIET选项禁用信息性消息
- 如果设置了REQUIRED选项,那么找不到包时将退出并报错
特定于包的必需组件列表可以列在components选项之后(如果存在的话,也可以列在REQUIRED选项之后)。其他可选组件可以在OPTIONAL_COMPONENTS之后列出
[version]参数请求一个与找到的包兼容的版本。有两种可能的规定形式:
- 一个格式为major[.minor[.patch[.tweak]]的单一版本。
- 格式为versionMin…[<]versionMax的版本范围,其中versionMin和versionMax的格式与单个版本相同。默认情况下,包括两个端点。通过指定<,将排除上端点。仅CMake 3.19或更高版本支持版本范围。
EXACT选项要求版本完全匹配。此选项与版本范围的规范不兼容。
有关NO_POLICY_SCOPE选项的讨论,请参阅cmake_policy()命令文档。
命令有两种模式用于搜索包:“模块”模式和“配置”模式。以上签名选择模块模式。如果找不到模块,命令将返回到配置模式,如下所述。如果给定了模块选项,则此回退将被禁用。
在Module模式下,CMake搜索一个名为Find< PackageName >. CMake的文件。该文件首先在CMAKE_MODULE_PATH中搜索,然后在CMake安装提供的Find Modules中搜索。如果找到了该文件,则由CMake读取并处理它。它负责查找包,检查版本,并生成任何需要的消息。有些查找模块提供有限或不支持版本控制;检查模块文档。
如果MODULE选项没有在上面的签名中指定,那么CMake首先使用MODULE模式搜索包。然后,如果没有找到包,它将使用Config模式再次搜索。用户可以设置变量CMAKE_FIND_PACKAGE_PREFER_CONFIG为TRUE,以便在退回到Module模式之前先使用Config模式进行CMake搜索。
全签名和配置模式
用户代码通常应该寻找使用上述基本签名的包。此命令文档的其余部分指定完整的命令签名和搜索过程的详细信息。希望通过此命令提供一个包的项目维护者可以继续阅读。
find_package(<PackageName> [version] [EXACT] [QUIET][REQUIRED] [[COMPONENTS] [components...]][OPTIONAL_COMPONENTS components...][CONFIG|NO_MODULE][NO_POLICY_SCOPE][NAMES name1 [name2 ...]][CONFIGS config1 [config2 ...]][HINTS path1 [path2 ... ]][PATHS path1 [path2 ... ]][PATH_SUFFIXES suffix1 [suffix2 ...]][NO_DEFAULT_PATH][NO_PACKAGE_ROOT_PATH][NO_CMAKE_PATH][NO_CMAKE_ENVIRONMENT_PATH][NO_SYSTEM_ENVIRONMENT_PATH][NO_CMAKE_PACKAGE_REGISTRY][NO_CMAKE_BUILDS_PATH] # Deprecated; does nothing.[NO_CMAKE_SYSTEM_PATH][NO_CMAKE_SYSTEM_PACKAGE_REGISTRY][CMAKE_FIND_ROOT_PATH_BOTH |ONLY_CMAKE_FIND_ROOT_PATH |NO_CMAKE_FIND_ROOT_PATH])
CONFIG选项、同义词NO_MODULE选项或基本签名中未指定的选项的使用都强制采用纯CONFIG模式。在纯粹的Config模式下,命令会跳过模块模式搜索而立即执行Config模式搜索。
配置模式搜索尝试查找由要查找的包提供的配置文件。
- 创建一个名为< PackageName >_DIR的缓存项来保存包含该文件的目录。
- 默认情况下,该命令搜索名称为< PackageName >的包。如果给出NAMES选项,则使用其后的名称,而不是< PackageName >。
- 该命令为指定的每个名称搜索名为< PackageName >Config.cmake或< lower case package name >-Config.cmake的文件。
- 可以使用CONFIGS选项提供可能的配置文件名的替换集。搜索程序如下所述。找到配置文件后,CMake将读取并处理该文件。因为文件是由包提供的,所以它已经知道包内容的位置。
- 配置文件的完整路径存储在cmake变量< PackageName >_CONFIG中。
CMake在搜索具有适当版本的软件包安装时考虑的所有配置文件都存储在CMake变量< PackageName >_CONSIDERED_CONFIGS中,相关版本存储在< PackageName >_CONSIDERED_VERSIONS.中。
如果无法找到包配置文件,除非指定了QUIET参数,否则CMake将产生描述问题的错误。如果指定了REQUIRED且没有找到包,则会生成致命错误,配置步骤会停止执行。如果< PackageName >_DIR已经被设置为一个不包含配置文件的目录,CMake将忽略它并从头开始搜索。
我们鼓励提供CMake包配置文件的包维护人员对它们进行命名和安装,这样下面列出的Search Procedure就可以在不需要使用其他选项的情况下找到它们。
版本选择
- 当给出[version]参数时,配置模式将只找到声称与请求的版本兼容的包版本(请参阅格式规范)
- 如果提供了EXACT选项,则只能找到声明与请求版本完全匹配的包版本。
- CMake没有为版本号的含义建立任何约定。包版本号由包本身提供的“版本”文件检查。对于候选包配置文件< config-file>.cmake,相应的版本文件位于其旁边,并命名为< config-file >-version.cmake或 < config-file>version.cmake。
- 如果没有此类版本文件可用,则假定配置文件与任何请求的版本不兼容。可以使用CMakePackageConfigHelpers模块创建包含通用版本匹配代码的基本版本文件。
- 找到版本文件后,将加载该文件以检查请求的版本号。版本文件加载到嵌套范围中,其中定义了以下变量:
- PACKAGE_FIND_NAME:即 < PackageName >
- PACKAGE_FIND_VERSION:完整请求的版本字符串
- PACKAGE_FIND_VERSION_MAJOR:如果请求主版本,否则为0
- PACKAGE_FIND_VERSION_MINOR:如果要求次要版本,否则为0
- PACKAGE_FIND_VERSION_PATCH:如果请求补丁版本,则为0
- PACKAGE_FIND_VERSION_TWEAK:如果请求调整版本,否则0
- PACKAGE_FIND_VERSION_COUNT:版本组件个数,0 ~ 4
- 当指定了版本范围时,上述版本变量将根据版本范围的低端保存值。这是为了保持与未实现的软件包的兼容性,以期望版本范围。此外,版本范围将用以下变量来描述:
- PACKAGE_FIND_VERSION_RANGE:完整请求的版本范围字符串
- PACKAGE_FIND_VERSION_RANGE_MIN:它指定是应该包含还是排除版本范围的低端端点。目前,这个变量唯一支持的值是INCLUDE。
- PACKAGE_FIND_VERSION_RANGE_MAX:它指定是应该包含还是排除版本范围的上端点。这个变量支持的值是INCLUDE和EXCLUDE。
搜索过程
CMake为包构造一组可能的安装前缀。在每个前缀下搜索配置文件的多个目录。下面的表显示了搜索的目录。每一项都适用于遵循Windows (W)、UNIX (U)或Apple (A)约定的安装树:
<prefix>/ (W)
<prefix>/(cmake|CMake)/ (W)
<prefix>/<name>*/ (W)
<prefix>/<name>*/(cmake|CMake)/ (W)
<prefix>/(lib/<arch>|lib*|share)/cmake/<name>*/ (U)
<prefix>/(lib/<arch>|lib*|share)/<name>*/ (U)
<prefix>/(lib/<arch>|lib*|share)/<name>*/(cmake|CMake)/ (U)
<prefix>/<name>*/(lib/<arch>|lib*|share)/cmake/<name>*/ (W/U)
<prefix>/<name>*/(lib/<arch>|lib*|share)/<name>*/ (W/U)
<prefix>/<name>*/(lib/<arch>|lib*|share)/<name>*/(cmake|CMake)/ (W/U)
在支持macOS框架和BUNDLE的系统上,会在以下目录中搜索包含配置文件的框架或应用包:
<prefix>/<name>.framework/Resources/ (A)
<prefix>/<name>.framework/Resources/CMake/ (A)
<prefix>/<name>.framework/Versions/*/Resources/ (A)
<prefix>/<name>.framework/Versions/*/Resources/CMake/ (A)
<prefix>/<name>.app/Contents/Resources/ (A)
<prefix>/<name>.app/Contents/Resources/CMake/ (A)
在所有情况下,< name >被视为不区分大小写,并对应于任何指定的名称(< PackageName >或NAMES 给出的名称)。
如果设置了CMAKE_LIBRARY_ARCHITECTURE变量,那么带有lib/< arch >的路径将被启用。lib*包含一个或多个值lib64、lib32、libx32或Lib(按此顺序搜索)。
- 如果FIND_LIBRARY_USE_LIB64_PATHS属性设置为TRUE,则在64位平台上搜索具有lib64的路径。
- 如果FIND_LIBRARY_USE_LIB32_PATHS属性设置为TRUE,则在32位平台上搜索具有lib32的路径。
- 如果FIND_LIBRARY_USE_LIBX32_PATHS属性设置为TRUE,则使用x32 ABI在平台上搜索libx32的路径。
- 总是搜索lib路径。
如果指定了PATH_SUFFIXES ,则将后缀逐个附加到每个(W)或(U)目录条目。
这组目录旨在与在安装树中提供配置文件的项目协同工作。上面标有(W)的目录用于Windows上的安装,其中前缀可能指向应用程序安装目录的顶部。标记为(U)的用于UNIX平台上的安装,其中前缀由多个包共享。这只是一个约定,所以所有的(W)和(U)目录仍然在所有平台上搜索。标有(A)的目录用于在Apple平台上安装。CMAKE_FIND_FRAMEWORK和CMAKE_FIND_APPBUNDLE变量决定优先次序。
安装前缀集是通过以下步骤构造的。如果指定了NO_DEFAULT_PATH,则启用所有NO_*选项。
- 3.12新版功能:搜索< PackageName >_ROOT CMake变量和< PackageName >_ROOT环境变量中指定的路径,其中< PackageName >是要找到的包。包的根变量被维护为一个堆栈,因此如果从一个find模块中调用,来自父模块的find模块的根路径也将在当前包的路径之后进行搜索。如果传递了NO_PACKAGE_ROOT_PATH,或者将CMAKE_FIND_USE_PACKAGE_ROOT_PATH设置为FALSE,则可以跳过这个步骤。看到CMP0074政策。
- 在cmake特定缓存变量中指定的搜索路径。这些将用于命令行中,且值为-DVAR=value。这些值被解释为分号分隔的列表。如果传入了NO_CMAKE_PATH,或者将CMAKE_FIND_USE_CMAKE_PATH设置为FALSE,则可以跳过这个步骤
- 在cmake特定环境变量中指定的搜索路径。这些是在用户的shell配置中设置的,因此使用主机的本机路径分隔符(;在Windows和:在UNIX上)。如果传入了NO_CMAKE_ENVIRONMENT_PATH,或者将CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH设置为FALSE,则可以跳过这个步骤
- 由提示选项指定的搜索路径。这些路径应该是由系统自省计算出来的,比如已经找到的另一个项目的位置提供的提示。硬编码猜测应该用路径选项指定。
- 搜索标准的系统环境变量。如果传递了NO_SYSTEM_ENVIRONMENT_PATH,或者将CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH设置为FALSE,则可以跳过此步骤。以/bin或/sbin结尾的路径条目会自动转换为它们的父目录
- 搜索路径存储在CMake用户包注册表。如果传递了NO_CMAKE_PACKAGE_REGISTRY变量,或者将变量CMAKE_FIND_USE_PACKAGE_REGISTRY设置为FALSE,或者将已弃用的变量CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY设置为TRUE,则可以跳过这个变量。关于用户包注册表的详细信息,请参见cmake-packages(7)手册。
- 搜索cmake变量在平台文件中定义的当前系统。如果传入了NO_CMAKE_SYSTEM_PATH,或者将CMAKE_FIND_USE_CMAKE_SYSTEM_PATH设置为FALSE,则可以跳过这个步骤
- 检索路径存储在CMake系统包注册表。如果传递了NO_CMAKE_SYSTEM_PACKAGE_REGISTRY变量,或者将CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY变量设置为FALSE,或者将CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY变量设置为TRUE,则可以跳过这个变量。
- 搜索由PATHS选项指定的路径。这些通常是硬编码的猜测。
3.16新版功能:添加了CMAKE_FIND_USE__PATH变量来全局禁用各种搜索位置。
CMake变量CMAKE_FIND_ROOT_PATH指定一个或多个要添加到所有其他搜索目录的目录。这有效地“重新根”了给定位置下的整个搜索。CMAKE_STAGING_PREFIX的后代路径将被排除在重新生根之外,因为该变量始终是主机系统上的路径。默认情况下,CMAKE_FIND_ROOT_PATH为空。
CMAKE_SYSROOT变量还可以用来指定一个目录作为前缀。设置CMAKE_SYSROOT还有其他效果。有关该变量的更多信息,请参见文档。
当交叉编译指向目标环境的根目录时,这些变量特别有用,CMake也会在那里进行搜索。默认情况下,首先搜索CMAKE_FIND_ROOT_PATH中列出的目录,然后搜索CMAKE_SYSROOT目录,然后搜索非根目录。默认行为可以通过设置CMAKE_FIND_ROOT_PATH_MODE_PACKAGE进行调整。这个行为可以在每次调用的基础上使用选项手动重写:
- CMAKE_FIND_ROOT_PATH_BOTH:按上面描述的顺序进行搜索。
- NO_CMAKE_FIND_ROOT_PATH:不要使用CMAKE_FIND_ROOT_PATH变量。
- ONLY_CMAKE_FIND_ROOT_PATH:只搜索重新根目录和CMAKE_STAGING_PREFIX下面的目录。
默认搜索顺序被设计为最特定于最不特定于常见用例。项目可以通过多次调用该命令并使用NO_*选项来覆盖该命令:
find_package (<PackageName> PATHS paths... NO_DEFAULT_PATH)
find_package (<PackageName>)
一旦其中一个调用成功,结果变量将被设置并存储在缓存中,以便不再进行调用搜索。
默认情况下,存储在结果变量中的值将是找到文件的路径。在调用find_package之前,CMAKE_FIND_PACKAGE_RESOLVE_SYMLINKS变量可以设置为TRUE,以便解析符号链接并存储文件的真实路径。
每个非必需的find_package调用都可以通过将CMAKE_DISABLE_FIND_PACKAGE_变量设置为TRUE来禁用。
使用示例
find_package(OpenCVPATHS /opt/opencvNO_DEFAULT_PATHREQUIRED)
if (OpenCV_FOUND)include_directories(${OpenCV_INCLUDE_DIRS})message( ${OpenCV_LIBS})
else()message("OpenCV not found, so we won't build the project.")
endif()
cmake:指定find_package的搜索路径相关推荐
- gcc指定头文件搜索路径及动态链接库搜索路径
一.#include <>与#include "" #include <>直接到系统指定的某些目录中去找某些头文件. #include "&quo ...
- adb: createprocessw failed: 系统找不到指定的路径_gcc编译过程、gcc命令参数、静态库和动态库搜索路径...
一.gcc编译过程 gcc -E hello.c -o hello.s //预处理 gcc -S hello.s -o hello.i //编译 gcc -c hello.i -o hello.o / ...
- linux 动态库系统目录,Linux操作系统:指定动态库(.so)搜索路径(4)
表1: 程序pos输出结果和动态库的对应关系 创建各个动态库,并放置在相应的目录中.测试环境就准备好了.执行程序pos,并在该命令行中设置环境变量LD_LIBRARY_PATH. # LD_LIBRA ...
- Linux动态库(.so)搜索路径
众所周知,Linux动态库的默认搜索路径是/lib和/usr/lib.动态库被创建后,一般都复制到这两个目录中.当程序执行时需要某动态库,并且该动 态库还未加载到内存中,则系统会自动到这两个默认搜索路 ...
- linux path环境变量检索目录,Linux下动态链接库加载路径及搜索路径问题
引子 近日,服务器迁移后,偷懒未重新编译nginx的,直接./nginx启动,结果遇到如下问题: "error while loading shared libraries" 这是 ...
- Linux下gcc编译中关于头文件与库文件搜索路径相关问题
如何指定GCC的默认头文件路径 网上偶搜得之,以之为宝:) 原地址:http://blog.chinaunix.net/u/28781/showart.php?id=401631 ========== ...
- Linux下动态共享库加载时的搜索路径详解
对动态库的实际应用还不太熟悉的读者可能曾经遇到过类似"error while loading shared libraries"这样的错误,这是典型的因为需要的动态库不在动态链接器 ...
- linux定位so快捷方式_Linux动态库(.so)搜索路径 | 学步园
众所周知,Linux动态库的默认搜索路径是/lib和/usr/lib.动态库被创建后,一般都复制到这两个目录中.当程序执行时需要某动态库, 并且该动 态库还未加载到内存中,则系统会自动到这两个默认搜索 ...
- Linux c编译库路径,【一点一点学Linux C】交叉编译时候如何配置连接库的搜索路径...
交叉编译的时候不能使用本地(i686机器,即PC机器,研发机器)机器上的库,但是在做编译链接的时候默认的是使用本地库,即/usr/lib,/lib两个目录.因此,在交叉编译的时候,要采取一些方法使得在 ...
- linux中的变量文件路径,Linux库文件和Shell可执行程序命令文件搜索路径变量的设置...
一.库文件的搜索路径: 1.在配置文件/etc/ld.so.conf中指定动态库搜索路径(需要添加其它库文件的路径,在文件的最后添加具体的路径即可 [ 如:/usr/local/lib ],添加后保存 ...
最新文章
- nginx系列:nginx反向缓存代理详解
- 程序员 :超越软件蓝领的七种武器
- 寻找道路(codevs 3731)题解
- UGUI_UGUI组件属性
- 2018年第九届省赛C/C++A组第2题——星期一
- [html] 你知道微信端的浏览器内核是什么吗?
- android wifi连接手机,Android手机无线连接利器-AirDroid
- 解决apache的the requested operation has failed
- HDU3032_NimOrNotNim解题报告
- Atitit sumdoc index v6 u33.docx Atitit sumdoc index s99 目录 1. Zip ver 1 1.1. C:\Users\Adminis
- Cocos2dx-lua组件tableView的简单用法
- Redis入门指南笔记
- FPGA模拟PS/2键盘
- 详解智慧城市排水管理系统整体方案
- 第八周、第九周学习总结
- 这几个专业考上研再考公务员更有优势!
- python批量制作ppt_python批量将文件夹内所有PPT转化为PPTX
- MATLAB代码:考虑退化成本的混合储能微电网双层能源管理系统 可再生能源 (RES) 和储能系统 (ESS) 在微电网中的集成为最终用户和系统运营商提供了潜在的利益
- 网页版数据库管理工具安装教程——phpAdmin
- python创建学生类和教师类,python,学校成员类的例子,老师和学生(python class父类与子类之间的联系与逻辑)...
热门文章
- 《经营的本质》序“经营的逻辑”--读后感及读书笔记
- ie打开本地html页面慢,ie11 第一次浏览jquery+CSS3网页时候延时3秒
- DispatchQueue (SwiftUI Dispatch 中文手册)
- Android开启双摄像头
- 站队(使用插入排序完成)——————来自MC老玩家的怒吼
- Idea,webStorm工具栏显示,添加快捷方式建文件
- 国内最长的地铁投影画廊在上海地铁诞生
- 【知识图谱】实践篇——基于知识图谱的《红楼梦》人物关系可视化及问答系统实践:part5人物关系全貌与问答初入
- Oracle:ORA-00054 资源正忙 -- 锁表的解决方法
- 计算机应用高级教程,大学计算机应用高级教程(第3版)简介,目录书摘