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 中已添加: bzip2 和 zlib 组件(仅限 Windows)。
版本 3.11 中已添加: OPTIONAL_COMPONENTS 选项。
版本 3.13 中已添加: stacktrace_* 组件。
版本 3.19 中已添加: 所有平台上的 bzip2 和 zlib 组件。
结果变量¶
此模块定义了以下变量
Boost_FOUND一个布尔值,指示是否找到了头文件和请求的库。
Boost_INCLUDE_DIRSBoost 的 include 目录。
Boost_LIBRARY_DIRS用于链接 Boost 库的目录。
Boost_LIBRARIES需要链接的 Boost 组件库。
Boost_<COMPONENT>_FOUND一个布尔值,指示是否找到了组件
<COMPONENT>(<COMPONENT>名称是大写的)。Boost_<COMPONENT>_LIBRARY用于组件
<COMPONENT>的链接库(可能包括target_link_libraries()的 debug/optimized 关键字)。Boost_VERSION_MACRO来自
boost/version.hpp的BOOST_VERSION值。Boost_VERSION_STRINGBoost 版本号,格式为
X.Y.Z。Boost_VERSIONBoost 版本号,格式为
X.Y.Z(与Boost_VERSION_STRING相同)。版本 3.15 中已更改: 在之前的 CMake 版本中,此变量使用 Boost 头文件中的原始版本字符串(与
Boost_VERSION_MACRO相同)。请参阅策略CMP0093。Boost_LIB_VERSION附加到库文件名的版本字符串。
Boost_VERSION_MAJOR,Boost_MAJOR_VERSIONBoost 主版本号(
X.Y.Z中的X)。Boost_VERSION_MINOR,Boost_MINOR_VERSIONBoost 次版本号(
X.Y.Z中的Y)。Boost_VERSION_PATCH,Boost_SUBMINOR_VERSIONBoost 补丁版本号(
X.Y.Z中的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_RELEASE 和 Boost_LIBRARY_DIR_DEBUG。
提示¶
此模块从以下变量读取搜索位置的提示信息:
BOOST_ROOT,BOOSTROOT首选安装前缀。
BOOST_INCLUDEDIR首选 include 目录,例如
<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_INCLUDEDIR 和 Boost_ADDITIONAL_VERSIONS)、Boost_INCLUDE_DIR 附近的“lib”目录以及下面的库名称配置设置来搜索请求的组件库。它将库目录保存在 Boost_LIBRARY_DIR_DEBUG 和 Boost_LIBRARY_DIR_RELEASE 中,并将单独的库位置保存在 Boost_<COMPONENT>_LIBRARY_DEBUG 和 Boost_<COMPONENT>_LIBRARY_RELEASE 中。当在同一构建树中更改了先前搜索使用的设置(不包括环境变量)时,此模块会丢弃受更改影响的先前搜索结果并重新搜索。
导入的目标¶
3.5 版本新增。
此模块提供以下 导入目标
Boost::boost用于仅头文件依赖的 Target。(Boost include 目录)。
Boost::headers版本 3.15 中已添加:
Boost::boost的别名。Boost::<component>用于特定组件依赖(共享库或静态库)的 Target;
<component>名称是小写的。Boost::diagnostic_definitions用于启用有关 Boost 自动链接的诊断信息的接口 Target(添加
-DBOOST_LIB_DIAGNOSTIC)。Boost::disable_autolinking用于禁用与 MSVC 自动链接的接口 Target(添加
-DBOOST_ALL_NO_LIB)。Boost::dynamic_linking用于启用与 MSVC 动态链接的接口 Target(添加
-DBOOST_ALL_DYN_LINK)。
隐式依赖项,例如 Boost::filesystem 需要 Boost::system,即使在 find_package() 中未指定 system 并且 Boost::system 未添加到 target_link_libraries() 中时,也会被自动检测并满足。如果使用 Boost::thread,则 Threads::Threads 也会被自动添加。
需要注意的是,导入的 Target 的行为与此模块创建的变量不同:在同一目录或子目录中多次调用具有不同选项(例如静态或共享)的 find_package(Boost) 不会覆盖第一次调用创建的 Target 的值。
其他变量¶
Boost 库有许多变体,这些变体编码在文件名中。用户或项目可以通过设置以下变量来告诉此模块查找哪个变体:
Boost_USE_DEBUG_LIBS3.10 版本新增。
设置为
ON或OFF来指定是否搜索和使用 Debug 库。默认为ON。Boost_USE_RELEASE_LIBS3.10 版本新增。
设置为
ON或OFF来指定是否搜索和使用 Release 库。默认为ON。Boost_USE_MULTITHREADED设置为 OFF 以使用非多线程库(“mt”标签)。默认为
ON。Boost_USE_STATIC_LIBS设置为 ON 以强制使用静态库。默认为
OFF。Boost_USE_STATIC_RUNTIME设置为
ON或OFF来指定是否使用与 C++ 运行时静态链接的库(“s”标签)。默认值取决于平台。Boost_USE_DEBUG_RUNTIME设置为
ON或OFF来指定是否使用与 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 版本中新增。
设置为 Boost 静态库使用的特定于平台的库名称前缀(例如
lib)。仅在 CMake 默认不知道前缀的平台上需要此设置。Boost_ARCHITECTURE3.13 版本新增。
设置为特定于架构的库后缀(例如
-x64)。默认值为自动计算,基于当前使用的 C++ 编译器。Boost_THREADAPI用于
thread组件库名称的后缀,例如pthread或win32。将同时尝试带有和不带有此后缀的名称。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_RELEASE和Boost_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 库并使用导入的 Target
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 库并使用导入的 Target
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.cmake 或 boost-config.cmake 的包配置文件,并将结果存储在 CACHE 条目 Boost_DIR 中。如果找到,则会加载包配置文件,并且此模块将不再执行任何操作。有关 Boost CMake 包配置文件提供的详细信息,请参阅其文档。
设置 Boost_NO_BOOST_CMAKE 为 ON,以禁用对 boost-cmake 的搜索。