[cmake] --- find_package

1 find_package的作用

find_package是CMake中用于查找并加载外部库的指令。它可以根据指定的参数在系统或用户指定的路径中查找库文件,并生成相应的变量供后续使用。

2 find_package基本语法

find_package(<PackageName> [version] [EXACT] [QUIET] [MODULE]
             [REQUIRED] [[COMPONENTS] [components...]]
             [OPTIONAL_COMPONENTS components...]
             [NO_POLICY_SCOPE])

参数解释:
version: 版本合适(大版本号相同)
EXACT: 版本必须一致
QUIET: 没找到包也不会报错
REQUIRED: 必须找到该包,否则停止

用法举例:

// 查找名为 OpenCV 的包,找不到不报错,也不打印任何信息。
find_package(OpenCV QUIET)

// 查找名为 OpenCV 的包,找不到就报错(并终止 cmake 进程,不再继续往下执行)
find_package(OpenCV REQUIRED) # 最常见用法

// 查找名为 OpenCV 的包,找不到就报错,且必须具有 OpenCV::core 和 OpenCV::videoio 这两个组件,如果没有这两个组件也会报错
find_package(OpenCV REQUIRED COMPONENTS core videoio)

//查找名为 OpenCV 的包,找不到就报错,可具有 OpenCV::core 和 OpenCV::videoio 这两个组件,没有这两组件不会报错,通过 ${OpenCV_core_FOUND} 查询是否找到 core 组件。
find_package(OpenCV REQUIRED OPTIONAL_COMPONENTS core videoio)

3 find_package的寻找路径

find_package指令会在以下路径下查找包:

系统默认路径:find_package会首先在系统默认的路径中查找包。这些路径通常包括一些常用的包管理器和操作系统提供的包目录。

CMake模块路径:如果CMake模块被启用,find_package还会在CMake模块路径中查找包。可以通过设置CMAKE_MODULE_PATH变量来指定额外的模块路径。

用户指定的路径:可以使用CMAKE_PREFIX_PATH变量来指定额外的搜索路径。这样,find_package就会在这些指定的路径中查找包。

项目路径:如果当前正在处理的项目有定义了CMAKE_PREFIX_PATH变量,那么find_package也会在该项目的路径中查找包。

总之,find_package会在系统默认路径、CMake模块路径、用户指定的路径以及项目路径中进行包的查找。

4 find_package的两种找包模式

4.1 Module mode和config mode介绍

find_package指令有两种查找包的模式:模块模式(Module mode)和配置模式(Config mode)。

模块模式(Module mode):在模块模式下,find_package会在指定的路径中查找名为 < package >-config.cmake的文件。如果找到了这个文件,那么它会将该文件所在的目录添加到包含目录中,并生成相应的变量,如< package>_INCLUDE_DIRS、< package>_LIBRARIES等。这样,你就可以在项目中使用这个包提供的头文件和库文件了。

配置模式(Config mode):在配置模式下,find_package会在指定的路径中查找名为< package>Config.cmake的文件。如果找到了这个文件,那么它会将该文件所在的目录添加到包含目录中,并生成相应的变量,如< package>_INCLUDE_DIRS、< package>_LIBRARIES等。然后,它会调用该文件中的add_subdirectory()函数,将子目录中的模块和配置模式的包也加入到查找过程中。这样,你就可以在项目中使用这个包提供的头文件、库文件以及子目录中的其他包了。

4.2 Module mode和config mode使用举例

模块模式(Module mode)和配置模式(Config mode)是find_package指令的两种查找包的模式。下面分别给出两种模式的使用举例:

模块模式(Module mode):
假设我们有一个名为example的包,它提供了一个名为Example的模块。我们可以使用模块模式来查找和使用这个包。
首先,在CMakeLists.txt文件中添加以下内容:

# 设置寻找路径
set(CMAKE_PREFIX_PATH /path/to/search1 /path/to/search2)

# 查找名为"example"的包
find_package(example REQUIRED)

# 使用包中的模块
include_directories(${example_INCLUDE_DIRS})
add_executable(my_app main.cpp)
target_link_libraries(my_app ${example_LIBRARIES})

在这个例子中,find_package会在指定的路径中查找名为example的包。如果找到了这个包,它会将该包所在的目录添加到包含目录中,并生成相应的变量,如example_INCLUDE_DIRS、example_LIBRARIES等。然后,我们可以在项目中使用这个包提供的头文件和库文件。

配置模式(Config mode):
假设我们有一个名为example的包,它提供了一个名为ExampleConfig.cmake的配置脚本。我们可以使用配置模式来查找和使用这个包。
首先,在CMakeLists.txt文件中添加以下内容:

# 设置寻找路径
set(CMAKE_PREFIX_PATH /path/to/search1 /path/to/search2)

# 查找名为"example"的包
find_package(example REQUIRED)

# 使用包中的配置脚本
include_directories(${example_INCLUDE_DIRS})
add_executable(my_app main.cpp)
target_link_libraries(my_app ${example_LIBRARIES})

在这个例子中,find_package会在指定的路径中查找名为example的包。如果找到了这个包,它会将该包所在的目录添加到包含目录中,并生成相应的变量,如example_INCLUDE_DIRS、example_LIBRARIES等。然后,它会调用该配置文件中的add_subdirectory()函数,将子目录中的模块和配置模式的包也加入到查找过程中。这样,我们就可以在项目中使用这个包提供的头文件、库文件以及子目录中的其他包了。

相关推荐

  1. Cmake

    2023-12-06 14:40:05       51 阅读
  2. <span style='color:red;'>Cmake</span>

    Cmake

    2023-12-06 14:40:05      69 阅读
  3. cmake

    2023-12-06 14:40:05       51 阅读
  4. <span style='color:red;'>CMake</span>

    CMake

    2023-12-06 14:40:05      67 阅读
  5. cmake

    2023-12-06 14:40:05       27 阅读
  6. CMakeCMake打包Dll

    2023-12-06 14:40:05       34 阅读
  7. CMAKE学习

    2023-12-06 14:40:05       59 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-06 14:40:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-06 14:40:05       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-06 14:40:05       82 阅读
  4. Python语言-面向对象

    2023-12-06 14:40:05       91 阅读

热门阅读

  1. 如何关闭vue项目中的[eslint]校验

    2023-12-06 14:40:05       66 阅读
  2. CSS外边距重叠:原理、结果

    2023-12-06 14:40:05       44 阅读
  3. LeetCode1005. Maximize Sum Of Array After K Negations

    2023-12-06 14:40:05       38 阅读
  4. vue打包完成后出现空白页原因及解决

    2023-12-06 14:40:05       64 阅读
  5. 代数学笔记8: Sylow定理

    2023-12-06 14:40:05       46 阅读
  6. Vue2学习笔记(数据监测)

    2023-12-06 14:40:05       57 阅读
  7. 【C/C++】可变参数va_list与格式化输出

    2023-12-06 14:40:05       56 阅读
  8. Windows如何启动MySQL

    2023-12-06 14:40:05       52 阅读
  9. Pytorch:torch.utils.data.random_split()

    2023-12-06 14:40:05       56 阅读
  10. VB.NET二维数组的组合

    2023-12-06 14:40:05       72 阅读