FindBoost

版本 3.30 中变更: 此模块仅在策略 CMP0167 未设置为 NEW 时可用。将项目移植到上游 Boost 的 BoostConfig.cmake 包配置文件,find_package(Boost) 现在会搜索它。

查找 Boost 包含目录和库

通过使用以下形式调用 find_package() 来使用此模块

find_package(Boost
  [version] [EXACT]      # Minimum or EXACT version e.g. 1.67.0
  [REQUIRED]             # Fail with error if Boost is not found
  [COMPONENTS <libs>...] # Boost libraries by their canonical name
                         # e.g. "date_time" for "libboost_date_time"
  [OPTIONAL_COMPONENTS <libs>...]
                         # Optional Boost libraries by their canonical name)
  )                      # e.g. "date_time" for "libboost_date_time"

此模块查找头文件和请求的组件库,或者由 “Boost CMake” 构建提供的 CMake 包配置文件。对于后一种情况,请跳至下面的 Boost CMake 部分。

版本 3.7 中新增: bzip2zlib 组件(仅限 Windows)。

版本 3.11 中新增: OPTIONAL_COMPONENTS 选项。

版本 3.13 中新增: stacktrace_* 组件。

版本 3.19 中新增: 所有平台上的 bzip2zlib 组件。

结果变量

此模块定义以下变量

Boost_FOUND

如果找到头文件和请求的库,则为 True。

Boost_INCLUDE_DIRS

Boost 包含目录。

Boost_LIBRARY_DIRS

Boost 库的链接目录。

Boost_LIBRARIES

要链接的 Boost 组件库。

Boost_<COMPONENT>_FOUND

如果找到组件 <COMPONENT>,则为 True(<COMPONENT> 名称为大写)。

Boost_<COMPONENT>_LIBRARY

要链接的组件 <COMPONENT> 的库(可能包括 target_link_libraries() debug/optimized 关键字)。

Boost_VERSION_MACRO

来自 boost/version.hppBOOST_VERSION 值。

Boost_VERSION_STRING

X.Y.Z 格式的 Boost 版本号。

Boost_VERSION

X.Y.Z 格式的 Boost 版本号(与 Boost_VERSION_STRING 相同)。

版本 3.15 中变更: 在之前的 CMake 版本中,此变量使用来自 Boost 头文件的原始版本字符串(与 Boost_VERSION_MACRO 相同)。请参阅策略 CMP0093

Boost_LIB_VERSION

附加到库文件名的版本字符串。

Boost_VERSION_MAJOR, Boost_MAJOR_VERSION

Boost 主版本号(XX.Y.Z 中)。

Boost_VERSION_MINOR, Boost_MINOR_VERSION

Boost 次版本号(YX.Y.Z 中)。

Boost_VERSION_PATCH, Boost_SUBMINOR_VERSION

Boost 子次版本号(ZX.Y.Z 中)。

Boost_VERSION_COUNT

版本组件的数量 (3)。

Boost_LIB_DIAGNOSTIC_DEFINITIONS (Windows 特有)

传递给 add_definitions() 以在编译期间显示有关 Boost 自动链接的诊断信息

版本 3.15 中新增: Boost_VERSION_<PART> 变量。

缓存变量

搜索结果持久保存在 CMake 缓存条目中

Boost_INCLUDE_DIR

包含 Boost 头文件的目录。

Boost_LIBRARY_DIR_RELEASE

包含 release Boost 库的目录。

Boost_LIBRARY_DIR_DEBUG

包含 debug Boost 库的目录。

Boost_<COMPONENT>_LIBRARY_DEBUG

组件 <COMPONENT> 库的 debug 变体。

Boost_<COMPONENT>_LIBRARY_RELEASE

组件 <COMPONENT> 库的 release 变体。

版本 3.3 中新增: 每个配置的变量 Boost_LIBRARY_DIR_RELEASEBoost_LIBRARY_DIR_DEBUG

提示

此模块从变量中读取有关搜索位置的提示

BOOST_ROOT, BOOSTROOT

首选安装前缀。

BOOST_INCLUDEDIR

首选包含目录,例如 <prefix>/include

BOOST_LIBRARYDIR

首选库目录,例如 <prefix>/lib

Boost_NO_SYSTEM_PATHS

设置为 ON 以禁用在这些提示变量未指定的位置中搜索。默认为 OFF

Boost_ADDITIONAL_VERSIONS

此模块未知的 Boost 版本列表。(Boost 安装位置可能包含版本)。

用户可以将这些提示或结果设置为 CACHE 条目。项目不应直接读取这些条目,而应使用上述结果变量。请注意,某些提示名称以大写 BOOST 开头。如果未将这些指定为 CMake 变量或缓存条目,则可以将其指定为环境变量。

此模块首先使用上述提示变量(排除 BOOST_LIBRARYDIR)搜索 Boost 头文件,并将结果保存在 Boost_INCLUDE_DIR 中。然后,它使用上述提示(排除 BOOST_INCLUDEDIRBoost_ADDITIONAL_VERSIONS)、Boost_INCLUDE_DIR 附近的 “lib” 目录以及下面的库名称配置设置搜索请求的组件库。它将库目录保存在 Boost_LIBRARY_DIR_DEBUGBoost_LIBRARY_DIR_RELEASE 中,并将各个库位置保存在 Boost_<COMPONENT>_LIBRARY_DEBUGBoost_<COMPONENT>_LIBRARY_RELEASE 中。当在同一构建树中更改先前搜索使用的设置(排除环境变量)时,此模块会丢弃受更改影响的先前搜索结果并再次搜索。

导入目标

版本 3.5 中新增。

此模块定义以下 IMPORTED 目标

Boost::boost

仅头文件依赖项的目标。(Boost 包含目录)。

Boost::headers

版本 3.15 中新增: Boost::boost 的别名。

Boost::<component>

特定组件依赖项的目标(共享库或静态库);<component> 名称为小写。

Boost::diagnostic_definitions

接口目标,用于在编译期间启用有关 Boost 自动链接的诊断信息(添加 -DBOOST_LIB_DIAGNOSTIC)。

Boost::disable_autolinking

接口目标,用于禁用与 MSVC 的自动链接(添加 -DBOOST_ALL_NO_LIB)。

Boost::dynamic_linking

接口目标,用于启用与 MSVC 的动态链接(添加 -DBOOST_ALL_DYN_LINK)。

隐式依赖项(例如 Boost::filesystem 需要 Boost::system)将被自动检测和满足,即使在使用 find_package() 时未指定 system,并且如果 Boost::system 未添加到 target_link_libraries() 中。如果使用 Boost::thread,则 Threads::Threads 也将自动添加。

重要的是要注意,导入目标的行为与此模块创建的变量不同:在同一目录或子目录中使用不同选项(例如 static 或 shared)多次调用 find_package(Boost) 不会覆盖第一次调用创建的目标的值。

其他变量

Boost 库有许多变体,编码在其文件名中。用户或项目可以通过设置变量来告诉此模块要查找哪个变体

Boost_USE_DEBUG_LIBS

版本 3.10 中新增。

设置为 ONOFF 以指定是否搜索和使用 debug 库。默认为 ON

Boost_USE_RELEASE_LIBS

版本 3.10 中新增。

设置为 ONOFF 以指定是否搜索和使用 release 库。默认为 ON

Boost_USE_MULTITHREADED

设置为 OFF 以使用非多线程库(“mt” 标记)。默认为 ON

Boost_USE_STATIC_LIBS

设置为 ON 以强制使用静态库。默认为 OFF

Boost_USE_STATIC_RUNTIME

设置为 ONOFF 以指定是否使用静态链接到 C++ 运行时的库(“s” 标记)。默认为平台相关。

Boost_USE_DEBUG_RUNTIME

设置为 ONOFF 以指定是否使用链接到 MS debug C++ 运行时的库(“g” 标记)。默认为 ON

Boost_USE_DEBUG_PYTHON

设置为 ON 以使用使用 debug Python 构建编译的库(“y” 标记)。默认为 OFF

Boost_USE_STLPORT

设置为 ON 以使用使用 STLPort 编译的库(“p” 标记)。默认为 OFF

Boost_USE_STLPORT_DEPRECATED_NATIVE_IOSTREAMS

设置为 ON 以使用使用 STLPort 弃用的 “native iostreams” 编译的库(“n” 标记)。默认为 OFF

Boost_COMPILER

设置为编译器特定的库后缀(例如 -gcc43)。默认为正在使用的 C++ 编译器自动计算。

版本 3.9 中变更: 如果要测试多个兼容的后缀,可以使用列表,按偏好降序排列。

Boost_LIB_PREFIX

版本 3.18 中新增。

设置为平台特定的库名称前缀(例如 lib),Boost 静态库使用它。这仅在 CMake 默认情况下不知道前缀的平台上需要。

Boost_ARCHITECTURE

版本 3.13 中新增。

设置为体系结构特定的库后缀(例如 -x64)。默认为正在使用的 C++ 编译器自动计算。

Boost_THREADAPI

thread 组件库名称的后缀,例如 pthreadwin32。将尝试使用和不使用此后缀的名称。

Boost_NAMESPACE

用于构建 boost 的备用命名空间,例如,如果设置为 myboost,将搜索 myboost_thread 而不是 boost_thread

可以设置的其他变量来控制此模块

Boost_DEBUG

设置为 ON 以启用来自 FindBoost 的调试输出。请在提交任何错误报告之前启用此选项。

Boost_REALPATH

设置为 ON 以解析发现的库的符号链接,以帮助进行打包。例如,“system” 组件库可能会解析为 /usr/lib/libboost_system.so.1.67.0 而不是 /usr/lib/libboost_system.so。这不会影响链接,除非用户需要此信息,否则不应启用。

Boost_LIBRARY_DIR

Boost_LIBRARY_DIR_RELEASEBoost_LIBRARY_DIR_DEBUG 的默认值。

Boost_NO_WARN_NEW_VERSIONS

版本 3.20 中新增。

设置为 ON 以抑制有关新 Boost 版本未知依赖项的警告。

在 Visual Studio 和 Borland 编译器上,Boost 头文件请求自动链接到相应的库。这需要显式链接匹配的库或在链接库搜索路径中可用。在这种情况下,将 Boost_USE_STATIC_LIBS 设置为 OFF 可能无法实现动态链接。Boost 自动链接通常请求静态库,但有一些例外(例如 Boost.Python)。使用

add_definitions(${Boost_LIB_DIAGNOSTIC_DEFINITIONS})

来要求 Boost 报告有关自动链接请求的信息。

示例

仅查找 Boost 头文件

find_package(Boost 1.36.0)
if(Boost_FOUND)
  include_directories(${Boost_INCLUDE_DIRS})
  add_executable(foo foo.cc)
endif()

查找 Boost 库并使用导入目标

find_package(Boost 1.56 REQUIRED COMPONENTS
             date_time filesystem iostreams)
add_executable(foo foo.cc)
target_link_libraries(foo Boost::date_time Boost::filesystem
                          Boost::iostreams)

查找 Boost Python 3.6 库并使用导入目标

find_package(Boost 1.67 REQUIRED COMPONENTS
             python36 numpy36)
add_executable(foo foo.cc)
target_link_libraries(foo Boost::python36 Boost::numpy36)

查找 Boost 头文件和一些静态(仅 release)库

set(Boost_USE_STATIC_LIBS        ON)  # only find static libs
set(Boost_USE_DEBUG_LIBS        OFF)  # ignore debug libs and
set(Boost_USE_RELEASE_LIBS       ON)  # only find release libs
set(Boost_USE_MULTITHREADED      ON)
set(Boost_USE_STATIC_RUNTIME    OFF)
find_package(Boost 1.66.0 COMPONENTS date_time filesystem system ...)
if(Boost_FOUND)
  include_directories(${Boost_INCLUDE_DIRS})
  add_executable(foo foo.cc)
  target_link_libraries(foo ${Boost_LIBRARIES})
endif()

Boost CMake

如果 Boost 是使用 boost-cmake 项目构建的,或者从 Boost 1.70.0 开始,它提供了一个包配置文件,用于 find_package 的 config 模式。此模块查找名为 BoostConfig.cmakeboost-config.cmake 的包配置文件,并将结果存储在 CACHE 条目 Boost_DIR 中。如果找到,则加载包配置文件,并且此模块返回,不再执行任何操作。有关它提供的详细信息,请参阅 Boost CMake 包配置的文档。

Boost_NO_BOOST_CMAKE 设置为 ON,以禁用搜索 boost-cmake。