相关链接
- 第三方库(包管理)
find_package
每一个模块都会定义以下几个变量find_package(Boost #名称1.46.1 #版本REQUIRED #是否必须COMPONENTS #加载该库的哪些组件filesystem #组件名system)
<LibaryName>_FOUND<LibaryName>_INCLUDE_DIR or <LibaryName>_INCLUDES<LibaryName>_LIBRARY or <LibaryName>_LIBRARIES
用法:可以通过变量<LibaryName>_FOUND来判断模块是否被找到
- 如果没有找到,按照工程的需要关闭某些特性、给出提醒或者中止编译
- 如果
<LibaryName>_FOUND为真,则将<LibaryName>_INCLUDE_DIR加入INCLUDE_DIRECTORIES
例子:
cmake_minimum_required(VERSION 3.5)# Set the project nameproject (imported_targets)# find a boost install with the libraries filesystem and systemfind_package(Boost 1.46.1 REQUIRED COMPONENTS filesystem system)# check if boost was foundif(Boost_FOUND) #如果找到,就会有<package>_FOUND宏message ("boost found")else()message (FATAL_ERROR "Cannot find Boost")endif()# Add an executableadd_executable(imported_targets main.cpp)# link against the boost librariestarget_link_libraries( imported_targetsPRIVATEBoost::filesystem)
语法
find_package(<PackageName> [version] [EXACT] [QUIET][REQUIRED] [[COMPONENTS] [components...]][OPTIONAL_COMPONENTS components...][CONFIG|NO_MODULE] #使用Config模式(默认是使用Module模式)[NO_POLICY_SCOPE][NAMES name1 [name2 ...]][CONFIGS config1 [config2 ...]][HINTS path1 [path2 ... ]][PATHS path1 [path2 ... ]][PATH_SUFFIXES suffix1 [suffix2 ...]][NO_DEFAULT_PATH][NO_PACKAGE_ROOT_PATH][NO_CMAKE_PATH][NO_CMAKE_ENVIRONMENT_PATH][NO_SYSTEM_ENVIRONMENT_PATH][NO_CMAKE_PACKAGE_REGISTRY][NO_CMAKE_BUILDS_PATH] # Deprecated; does nothing.[NO_CMAKE_SYSTEM_PATH][NO_CMAKE_SYSTEM_PACKAGE_REGISTRY][CMAKE_FIND_ROOT_PATH_BOTH |ONLY_CMAKE_FIND_ROOT_PATH |NO_CMAKE_FIND_ROOT_PATH])
find_package的两种模式与搜索路径
find_package有两种模式:Module和Config
- 如果Module失败,才会使用Config模式
所以find_package查找的顺序
- 在
CMAKE_MODULE_PATH变量中,搜索Find<LibraryName>.cmake文件 - 在cmake安装目录下搜索
Find<LibraryName>.cmake文件 - 找
<LibraryName>Config.cmake或<lower-case-package-name>-config.cmake文件
但是find_package在linux、windows、mac上都会有所区分,具体可以查看官方文档find_package。
Module模式
在Module模式中,CMake需要找到一个叫做Find<LibraryName>.cmake的文件
- 这个文件负责找到库所在的路径,为我们的项目引入头文件路径和库文件路径
Find<LibraryName>.cmake文件通常不由包本身提供。相反,它通常由第三方提供,比如操作系统、CMake等提供,甚至你也可以编写这个文件。
cmake搜索这个文件的路径有两个
CMAKE_MODULE_PATH变量中的目录- 另一个是cmake安装目录下的
<path_to_your_cmake>/share/cmake-<version>/Modules
如果Module模式搜索失败,没有找到Find<LibraryName>.cmake文件,则转入Config模式
Config模式
Config模式通过<LibraryName>Config.cmake或<lower-case-package-name>-config.cmake来引入我们我们需要的库。
例子:《第三方库(包管理)》——添加CMake已经安装好的包
find_package查找包失败的处理方式
- 打印
CMAKE_MODULE_PATH、CMAKE_MODULE_PATH变量,看目录有没有被加进去 - 按照find_package的搜索顺序,排查是否有多个
Find<LibraryName>.cmake - 确认使用的
Find<LibraryName>.cmake能够找到对应的包!
