CMake语法-find_package-查找库-pkg_check_modules-外部库信息-find_path-查找路径-find_library-查找库

本文详细介绍了CMake中find_package和find_library命令的使用,用于查找和引用第三方库。find_package能配置复杂的库包,包括头文件路径、库文件及依赖关系,而find_library则专注于查找单个库文件。pkg_check_modules是用于处理pkg-config支持的库信息。find_path用于查找文件,特别是头文件。文章通过实例解析了这些命令的工作原理和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.find_package-查找库

find_package 是 CMake 中的一个命令,用于在构建系统中查找和引入第三方库。当你在项目中使用了某个外部库(如 Boost、Eigen、OpenCV 等)时,可以利用 find_package 命令来查找并配置这些库的路径和其他相关设置。

基本语法如下:

find_package(package_name [version] [REQUIRED] [QUIET] [COMPONENTS component1 ...])
  • package_name: 要查找的包的名称。
  • version: (可选)指定要查找的包的版本,例如 “3.1.2”。
  • REQUIRED: (可选)如果指定此选项,且未找到指定的包,CMake 进程将报错并停止。
  • QUIET: (可选)静默模式,不输出查找过程信息。
  • COMPONENTS: (可选)某些包可能包含多个组件或模块,通过这个选项可以指定需要查找哪些组件。

一旦 find_package 成功找到所需的包,它通常会定义一些变量(如 <package>_FOUND,以及 <package>_INCLUDE_DIRS<package>_LIBRARIES 等),这样你就可以在 CMakeLists.txt 文件中正确链接和包含相应的头文件和库文件。

例如:

find_package(Boost REQUIRED COMPONENTS system filesystem)
if (Boost_FOUND)
  include_directories(${Boost_INCLUDE_DIRS})
  target_link_libraries(my_target ${Boost_LIBRARIES})
endif()

在这个例子中,CMake 将尝试查找并配置 Boost 库,并且需要其中的 system 和 filesystem 组件。如果成功找到,就将 Boost 的头文件目录添加到 include 目录,并将需要的库链接到目标 my_target。

find_package 工作原理概括如下:

  1. 搜索顺序

    • 首先,CMake 会在预定义的一系列路径(包括系统默认路径、环境变量指定路径以及用户自定义路径等)中查找名为 <package>Config.cmake<lowercase-package>-config.cmake 的配置文件。这类文件通常由库自身提供,包含了该库的安装路径、版本信息以及如何使用该库的相关指令。
    • 如果没有找到上述配置文件,CMake 则会查找名为 <package>.cmake 的模块文件,这是 CMake 自带的一些通用查找规则,针对一些常见的库(比如:FindBoost.cmake, FindOpenGL.cmake 等)。
  2. 查找内容

    • find_package 找到了正确的配置文件或模块后,它会执行一系列检测操作,寻找库的头文件路径 (<package>_INCLUDE_DIRS)、库文件路径 (<package>_LIBRARIES)、其他必要组件或工具等。
    • 对于现代 CMake 的库(遵循 Package Configuration File 的方式),还会查找导入的目标(imported targets),如 Boost::systemBoost::filesystem
  3. 结果处理

    • 查找结束后,CMake 会根据查找到的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值