相关链接

  1. 第三方库(包管理)

    find_package

    1. find_package(Boost #名称
    2. 1.46.1 #版本
    3. REQUIRED #是否必须
    4. COMPONENTS #加载该库的哪些组件
    5. filesystem #组件名
    6. system
    7. )
    每一个模块都会定义以下几个变量
  • <LibaryName>_FOUND
  • <LibaryName>_INCLUDE_DIR or <LibaryName>_INCLUDES
  • <LibaryName>_LIBRARY or <LibaryName>_LIBRARIES

用法:可以通过变量<LibaryName>_FOUND来判断模块是否被找到

  • 如果没有找到,按照工程的需要关闭某些特性、给出提醒或者中止编译
  • 如果<LibaryName>_FOUND为真,则将<LibaryName>_INCLUDE_DIR加入INCLUDE_DIRECTORIES

例子:

  1. cmake_minimum_required(VERSION 3.5)
  2. # Set the project name
  3. project (imported_targets)
  4. # find a boost install with the libraries filesystem and system
  5. find_package(Boost 1.46.1 REQUIRED COMPONENTS filesystem system)
  6. # check if boost was found
  7. if(Boost_FOUND) #如果找到,就会有<package>_FOUND宏
  8. message ("boost found")
  9. else()
  10. message (FATAL_ERROR "Cannot find Boost")
  11. endif()
  12. # Add an executable
  13. add_executable(imported_targets main.cpp)
  14. # link against the boost libraries
  15. target_link_libraries( imported_targets
  16. PRIVATE
  17. Boost::filesystem
  18. )

语法

  1. find_package(<PackageName> [version] [EXACT] [QUIET]
  2. [REQUIRED] [[COMPONENTS] [components...]]
  3. [OPTIONAL_COMPONENTS components...]
  4. [CONFIG|NO_MODULE] #使用Config模式(默认是使用Module模式)
  5. [NO_POLICY_SCOPE]
  6. [NAMES name1 [name2 ...]]
  7. [CONFIGS config1 [config2 ...]]
  8. [HINTS path1 [path2 ... ]]
  9. [PATHS path1 [path2 ... ]]
  10. [PATH_SUFFIXES suffix1 [suffix2 ...]]
  11. [NO_DEFAULT_PATH]
  12. [NO_PACKAGE_ROOT_PATH]
  13. [NO_CMAKE_PATH]
  14. [NO_CMAKE_ENVIRONMENT_PATH]
  15. [NO_SYSTEM_ENVIRONMENT_PATH]
  16. [NO_CMAKE_PACKAGE_REGISTRY]
  17. [NO_CMAKE_BUILDS_PATH] # Deprecated; does nothing.
  18. [NO_CMAKE_SYSTEM_PATH]
  19. [NO_CMAKE_SYSTEM_PACKAGE_REGISTRY]
  20. [CMAKE_FIND_ROOT_PATH_BOTH |
  21. ONLY_CMAKE_FIND_ROOT_PATH |
  22. NO_CMAKE_FIND_ROOT_PATH])

find_package的两种模式与搜索路径

find_package有两种模式:Module和Config

  • 如果Module失败,才会使用Config模式

所以find_package查找的顺序

  1. CMAKE_MODULE_PATH变量中,搜索Find<LibraryName>.cmake文件
  2. 在cmake安装目录下搜索Find<LibraryName>.cmake文件
  3. <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查找包失败的处理方式

  1. 打印CMAKE_MODULE_PATHCMAKE_MODULE_PATH变量,看目录有没有被加进去
  2. 按照find_package的搜索顺序,排查是否有多个Find<LibraryName>.cmake
  3. 确认使用的Find<LibraryName>.cmake能够找到对应的包!

参考链接

  1. Cmake之深入理解find_package()的用法