【cmake学习】find_package 详解

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(模块模式)

该模式下查找的是 Find<PackageName>.cmake 的文件。

cmake 通过 CMAKE_MODULE_PATH 设置模块模式的搜索路径:

# CMAKE_MODULE_PATH 是模块模式的默认搜索路径
# 方式一
set(CMAKE_MODULE_PATH xxx) 
# 方式二
list(APPEND CMAKE_MODULE_PATH 搜索路径)

二、find_package 的格式及内置变量

find_package 可以在搜索路径和默认路径(环境变量)中查找指定的库或者模块。无论使用哪种模式,都会设置一个 <PackageName>_FOUND 变量来指示是否找到了package。

1、签名格式

尖括号代表必填内容,中括号里的内容代表选择性填写内容

find_package(<PackageName> [version]     # 指定要查找的库或者模块(版本号可选)
             [EXACT]     # 要求version完全匹配
             [QUIET]     # 无论找到与否,都不产生任何提示性消息
             [REQUIRED]  # 要求必须找到 xxx.cmake,找不到就提示报错
             [[COMPONENTS] [components...]]  
             [OPTIONAL_COMPONENTS [components...]] 
             [MODULE]           # 仅使用模块模式
             [CONFIG|NO_MODULE] # 仅使用配置模式(两种写法是等效的)
             [GLOBAL]
             [NO_POLICY_SCOPE]
             [BYPASS_PROVIDER]
)

(1) [[COMPONENTS] [components...]]

查找 Package 中的指定模块,COMPONENTS 跟的是一个列表,只要列表中任意一个模块没有被找到,则认为整个 Package 没有被找到即 <PackageName>_FOUND 为 false

(如果存在REQUIRED选项,则可以省略COMPONENTS关键字)

# 如果opencv_core、opencv_highgui任意一者没有被找到
# 则认为 OpenCV 库没有找到
# 即 OpenCV_FOUND 为false
find_package(OpenCV COMPONENTS opencv_core opencv_highgui)

(2) [OPTIONAL_COMPONENTS [components...]] 

OPTIONAL_COMPONENTS 跟的也是一个列表,只要列表中的某一项被找到了,就认为是找到了,即 <PackageName>_FOUND 为 true

# 即便是没找到 opencv_xxx,但是找到了opencv_core 
# 则认为 OpenCV 库已被找到
# 即 OpenCV_FOUND 为true
find_package(OpenCV COMPONENTS opencv_core opencv_highgui opencv_xxx)

 

2、find_package 内置变量

find_package 一般都内置了一些变量:

  • <PackageName>_FOUND:可以判断是否找到对应的包或者模块
  • <PackageName>_INCLUDE_DIR:表示头文件目录(前提是包被找到才会被自动设置)
  • <PackageName>_LIBRARIES:表示库文件

以查找 OpenCV 库为例:

# 检索OpenCV库
find_package(OpenCV REQUIRED)

add_executable(main src/main.cpp)
if(OpenCV_FOUND)
    # 引入头文件目录
    include_directories(${OpenCV_INCLUDE_DIRS})
    # 链接库文件
    target_link_libraries(main ${OpenCV_LIBRARIES})
else(OpenCV_FOUND)
    message(FATAL_ERROR "OpenCV library not found")
endif()

注意:${OpenCV_LIBRARIES} 只是库名,不代表库目录,相当于在其他地方做了如下操作

set(OpenCV_LIBRARIES opencv_core opencv_calib3d opencv_highgui )
03-08
<think>好的,用户现在输入了“find”命令,但没有指定任何参数或路径。我需要模拟Linux终端在这种情况下会返回什么。 首先,回忆一下find命令的基本用法。当用户只输入“find”而没有其他参数时,终端通常会提示缺少路径参数,并显示用法信息。正确的语法应该是find [路径] [选项] [表达式]。 接下来,检查常见的Linux系统中find命令的默认行为。比如,在Ubuntu或CentOS中,直接运行“find”会报错,提示路径必须在前,或者显示缺少必要参数的错误信息。 然后,确定正确的错误消息格式。典型的错误信息可能类似于“find: missing argument to `-exec'”或其他相关提示,但更可能的是“find: paths must precede expression”。不过更常见的可能是简单的“find: missing operand”或提示正确的用法。 为了准确,最好参考实际系统的输出。比如,在某些系统中,运行“find”会显示“find: missing operand”并提示正确的用法,例如“Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]”。 确认之后,用户需要的是仅返回终端输出,不需要解释。因此,正确的回应应该是显示错误信息,通常包括“find: missing operand”和用法说明。 确保格式正确,使用代码块包裹,并且用中文回答用户的其他问题,但在这个情况下用户要求仅返回终端输出,所以直接给出错误信息即可。</think>``` find: missing operand Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression] ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值