【cmake学习】find_package 详解

find_package在CMake中用于查找和加载第三方库,支持Configmode和Modulemode两种搜索方式。Configmode查找xxx-config.cmake或XXXConfig.cmake,Modulemode查找Findxxx.cmake。搜索路径可通过CMAKE_PREFIX_PATH和CMAKE_MODULE_PATH设置。find_package的签名格式包含版本、组件等选项,并设置Package_FOUND变量指示是否找到库。找到库后,可以使用包括头文件目录和库文件在内的内置变量。

find_package 主要用于查找指定的 package,主要支持两种搜索方法:

  • Config mode:查找 xxx-config.cmake或 xxxConfig.cmake的文件,如OpenCV库的OpenCVConfig.cmake
  • Module mode:查找Findxxx.cmake文件,如OpenCV库中的FindCUDA.cmake

详细的find_package介绍参考链接:find_package详解


目录

一、检索模式

1、Config mode(配置模式)

2、Module mode(模块模式)

二、find_package 的格式及内置变量

1、签名格式

2、find_package 内置变量


一、检索模式

find_package 有两种检索模式,这两种模式存在优先级,如果其中一种检索模式没有找到所需模块,就会启用另一种模式。

不同模式下,find_package 使用的检索路径也会有所不同。

1、Config mode(配置模式)

该模式下查找的是 <lowercasePackageName>-config.cmake 或 <PackageName>Config.cmake的文件。xxx-config.cmake 文件一般是小写开头,XXXConfig.cmake 文件一般是大写开头。

cmake 通过 CMAKE_PREFIX_PATH 设置配置模式的搜索路径:

# CMAKE_PREFIX_PATH 是配置模式的搜索路径
# 方式一
set(CMAKE_PREFIX_PATH 搜索路径)
# 方式二
list(APPEND CMAKE_PREFIX_PATH 搜索路径)

2、Module mode(模块模式)

该模式下查找的是 

<think>好的,用户想了解如何配置CMake工具链文件用于交叉编译ARM Linux程序。我需要结合之前的引用内容来组织回答。首先,用户提到了设置CMAKE_SYSTEM_NAME、CMAKE_C_COMPILER和CMAKE_FIND_ROOT_PATH等参数,这些在引用里都有涉及。比如,引用3提到CMAKE_SYSTEM_NAME需要设置为目标操作系统,比如Linux,这样CMake才知道是在交叉编译。然后,引用2中的例子展示了如何设置C和C++编译器的路径,用户可能需要类似的配置。 接下来,用户可能需要一个完整的工具链文件示例,所以我要整理出一个标准的模板,包含必要的参数。例如,设置CMAKE_SYSTEM_PROCESSOR为arm,CMAKE_FIND_ROOT_PATH指向工具链的路径,这样CMake会在该路径查找库和头文件。引用4提到CMake生成交叉编译的makefile有两种方式,这里应该推荐使用工具链文件的方式,比较规范。 另外,需要注意交叉编译时可能需要调整find_package的行为,所以设置CMAKE_FIND_ROOT_PATH_MODE_PROGRAM和相关的变量为NEVER或ONLY,确保正确搜索依赖。这些内容在引用中虽然没有直接提到,但根据CMake的最佳实践,这些设置是必要的。 用户还可能想知道如何实际使用这个工具链文件,所以在示例之后,需要说明调用cmake命令时的参数,比如-DCMAKE_TOOLCHAIN_FILE。引用2中的路径设置可能也需要提醒用户根据实际路径修改。 最后,生成相关问题时要围绕工具链配置、交叉编译常见问题、优化和应用场景,这样用户可以有进一步的学习方向。确保回答结构清晰,分步骤说明,并引用相关的参考资料。</think>### CMake工具链文件配置详解(ARM Linux交叉编译) 配置CMake交叉编译工具链文件需包含以下核心参数,以ARM Linux为例: ```cmake # arm-linux-gnueabihf.cmake set(CMAKE_SYSTEM_NAME Linux) # 声明目标系统类型[^3] set(CMAKE_SYSTEM_PROCESSOR arm) # 目标处理器架构 # 设置交叉编译器路径 set(TOOLCHAIN_DIR /opt/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf) set(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/arm-linux-gnueabihf-gcc) set(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/arm-linux-gnueabihf-g++) # 设置根文件系统路径(可选) set(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR}/arm-linux-gnueabihf) # 调整find_*命令搜索策略 set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # 不搜索主机程序 set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) # 仅搜索目标库 set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) # 仅搜索目标头文件 ``` ### 使用说明 1. 保存上述内容为`arm-linux-gnueabihf.cmake` 2. 调用CMake时指定工具链文件: ```bash cmake -DCMAKE_TOOLCHAIN_FILE=arm-linux-gnueabihf.cmake .. ``` ### 参数解析 1. **CMAKE_SYSTEM_NAME**: 触发交叉编译模式的关键参数,设为`Linux`表示目标系统[^3] 2. **CMAKE_C_COMPILER**: 必须指定绝对路径,避免使用环境变量导致的路径解析问题[^2] 3. **CMAKE_FIND_ROOT_PATH**: 指定目标系统的根文件系统路径,用于查找依赖库 4. **FIND_ROOT_MODE设置**: 防止CMake在主机系统路径中搜索目标系统的资源
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值