文章目录
一.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
工作原理概括如下:
-
搜索顺序:
- 首先,CMake 会在预定义的一系列路径(包括系统默认路径、环境变量指定路径以及用户自定义路径等)中查找名为
<package>Config.cmake
或<lowercase-package>-config.cmake
的配置文件。这类文件通常由库自身提供,包含了该库的安装路径、版本信息以及如何使用该库的相关指令。 - 如果没有找到上述配置文件,CMake 则会查找名为
<package>.cmake
的模块文件,这是 CMake 自带的一些通用查找规则,针对一些常见的库(比如:FindBoost.cmake, FindOpenGL.cmake 等)。
- 首先,CMake 会在预定义的一系列路径(包括系统默认路径、环境变量指定路径以及用户自定义路径等)中查找名为
-
查找内容:
- 当
find_package
找到了正确的配置文件或模块后,它会执行一系列检测操作,寻找库的头文件路径 (<package>_INCLUDE_DIRS
)、库文件路径 (<package>_LIBRARIES
)、其他必要组件或工具等。 - 对于现代 CMake 的库(遵循 Package Configuration File 的方式),还会查找导入的目标(imported targets),如
Boost::system
和Boost::filesystem
。
- 当
-
结果处理:
- 查找结束后,CMake 会根据查找到的