相关链接
- 第三方库(包管理)
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 name
project (imported_targets)
# find a boost install with the libraries filesystem and system
find_package(Boost 1.46.1 REQUIRED COMPONENTS filesystem system)
# check if boost was found
if(Boost_FOUND) #如果找到,就会有<package>_FOUND宏
message ("boost found")
else()
message (FATAL_ERROR "Cannot find Boost")
endif()
# Add an executable
add_executable(imported_targets main.cpp)
# link against the boost libraries
target_link_libraries( imported_targets
PRIVATE
Boost::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
能够找到对应的包!