Boost C++ 库

...世界上最受推崇和设计最精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ 编码标准

Next

Boost.Config

Vesa Karvonen, John Maddock Beman Dawes

根据 Boost 软件许可协议 1.0 版本分发。(请参阅随附文件 LICENSE_1_0.txt 或在 https://boost.ac.cn/LICENSE_1_0.txt 复制)


目录

为你的平台配置 Boost
使用默认的 Boost 配置
<boost/config.hpp> 头文件
使用 configure 脚本
用户可设置的选项
高级配置用法
测试 Boost 配置
Boost 宏参考
广泛的 C++ 标准级别检查
描述 C++03 缺陷的宏
描述可选特性的宏
描述 C++11 不支持特性的宏
允许在 C++03 编译器中使用 C++11 特性的宏
描述 C++14 不支持特性的宏
允许在 C++11 或更早版本编译器中使用 C++14 特性的宏
描述 C++17 不支持特性的宏
允许在 C++14 或更早版本编译器中使用 C++17 特性的宏
描述 C++20 不支持特性的宏
描述 C++23 不支持特性的宏
描述已从标准中移除的特性的宏。
Boost 辅助宏
Boost 信息宏
Boost 弃用宏
用于具有独立源代码库的宏
构建时配置
标准整数类型
概述
原理
买者自负
精确宽度整数类型
最小宽度整数类型
最快最小宽度整数类型
最大宽度整数类型
整数常量宏
用于存储指针的整数
Boost 作者指南
禁用编译器警告
添加新的缺陷宏
添加新的特性测试宏
修改 Boost 配置头文件
原理
问题
解决方案
致谢

Boost 已经为大多数常见的编译器和平台配置完毕;你应该能够“按原样”使用 Boost。由于编译器与标准库是分开配置的,即使你用第三方标准库(如 STLport)替换编译器的标准库,默认配置也应该可以工作。

“按原样”使用 Boost 而不尝试重新配置是使用 Boost 的推荐方法。但是,如果你愿意,可以运行 configure 脚本,并且提供了回归测试,允许你使用特定的编译器设置测试当前的 Boost 配置。

Boost 库用户可以通过访问我们的 Github 并提交支持请求,来请求对其他编译器或平台的支持。

Boost 库实现通过以下方式访问配置宏

#include <boost/config.hpp>

虽然 Boost 库用户不需要直接包含该文件或使用这些配置宏,但这种使用方式是可以接受的。配置宏的用途、用法和限制都有文档记录,这使得它们可以被 Boost 库和用户代码使用。

Boost 信息辅助 宏旨在供 Boost 用户以及我们自己的内部使用。但请注意,特性测试缺陷测试 宏是为 Boost 库的内部使用而设计的,而不是用户代码,因此它们可能随时更改(尽管不会对它们进行无意义的更改)。配置宏更改导致的 Boost 库问题会被 Boost 回归测试捕获,因此 Boost 库会更新以解决这些更改。相比之下,Boost 库用户代码可能会在没有警告的情况下受到宏更改的不利影响。了解用户代码中使用的宏更改的最佳方法是监控 Boost 开发者列表上的讨论。

[Important] 重要提示

此 configure 脚本仅设置 Boost 头文件以供特定编译器使用。它对 Boost.Build 或库的构建方式没有影响。

如果你知道 Boost 为你的特定设置配置不正确,并且你位于类似 UNIX 的平台上,那么你可能想尝试通过运行 Boost configure 脚本来改进。从 shell 命令提示符下,你需要 cd 进入 <boost-root>/libs/config/ 并输入

sh ./configure

你将看到脚本在完成回归测试时正在检查的项目列表。请注意,configure 脚本仅在调用 g++、c++ 或 CC 时真正自动检测你的编译器。如果你正在使用其他编译器,则需要设置以下一个或多个环境变量

变量

描述

CXX

编译器的名称,例如 c++

CXXFLAGS

要使用的编译器标志,例如 -O2

LDFLAGS

要使用的链接器标志,例如 -L/mypath

LIBS

要链接的任何库,例如 -lpthread

例如,要使用 HP aCC 运行 configure 脚本,你可以使用类似

export CXX="aCC"
export CXXFLAGS="-Aa -DAportable -D__HPACC_THREAD_SAFE_RB_TREE \
   -DRWSTD_MULTI_THREAD -DRW_MULTI_THREAD -D_REENTRANT -D_THREAD_SAFE"
export LDFLAGS="-DAportable"
export LIBS="-lpthread"
sh ./configure

无论你如何运行 configure 脚本,当它完成时,你都会找到一个新的头文件 -user.hpp- 位于 <boost-root>/libs/config/ 目录中。 请注意,configure 默认情况下不会将此头文件安装到你的 boost 包含路径中。此头文件包含 configure 脚本生成的所有选项,以及一个头文件部分,其中包含默认版本的用户可设置选项 <boost/config/user.hpp>(位于 <boost-root>/boost/config/ 下)。 你可以通过两种方式使用此头文件

  • 选项 1: 将头文件复制到 <boost-root>/boost/config/,以便它替换 Boost 提供的默认 user.hpp。此选项仅允许一个 configure 生成的设置;Boost 开发者应避免此选项,因为它存在意外提交 configure 修改的 <boost/config/user.hpp> 到 svn 存储库的风险(你不会因此而受到感谢!)。
  • 选项 2: 为头文件指定一个更易于记忆的名称,并将其放置在方便的位置;然后,定义宏 BOOST_USER_CONFIG 以指向它。例如,创建一个新的子目录 <boost-root>/boost/config/ user/,并将头文件复制到那里;例如作为 multithread-gcc-config.hpp。然后,编译时添加命令行选项: -DBOOST_USER_CONFIG="<boost/config/user/multithread-gcc-config.hpp>",Boost 将使用新的配置头文件。此选项允许你生成多个配置头文件,并使它们与 Boost 源代码分开 - 以便对源代码的更新不会干扰你的配置。

有些配置选项代表用户选择,而不是编译器缺陷或平台特定选项。这些选项在 <boost/config/user.hpp> 和 configure 生成的 user.hpp 头文件的开头列出。你可以在命令行中定义这些选项,或通过编辑 <boost/config/user.hpp> 来定义,它们在下表中列出

描述

BOOST_USER_CONFIG

定义后,它应指向用户配置文件的名称,该文件将在任何 Boost 配置文件之前包含。未定义时,默认为 <boost/config/user.hpp>

BOOST_COMPILER_CONFIG

定义后,它应指向要使用的编译器配置文件的名称。定义此项会切断编译器选择逻辑,并消除对包含该逻辑的头文件的依赖。例如,如果你正在使用 gcc,则可以将 BOOST_COMPILER_CONFIG 定义为 <boost/config/compiler/gcc.hpp>

BOOST_STDLIB_CONFIG

定义后,它应指向要使用的标准库配置文件的名称。定义此项会切断标准库选择逻辑,并消除对包含该逻辑的头文件的依赖。例如,如果你正在使用 STLport,则可以将 BOOST_STDLIB_CONFIG 定义为 <boost/config/stdlib/stlport.hpp>

BOOST_PLATFORM_CONFIG

定义后,它应指向要使用的平台配置文件的名称。定义此项会切断平台选择逻辑,并消除对包含该逻辑的头文件的依赖。例如,如果你在 linux 上编译,则可以将 BOOST_PLATFORM_CONFIG 定义为 <boost/config/platform/linux.hpp>

BOOST_NO_COMPILER_CONFIG

定义后,不选择或包含任何编译器配置文件;当编译器完全符合标准时,或者用户头文件(请参阅 BOOST_USER_CONFIG)已添加任何必要的选项时定义,例如通过 autoconf 生成的 configure 脚本。

BOOST_NO_STDLIB_CONFIG

定义后,不选择或包含任何标准库配置文件;当标准库完全符合标准时,或者用户头文件(请参阅 BOOST_USER_CONFIG)已添加任何必要的选项时定义,例如通过 autoconf 生成的 configure 脚本。

BOOST_NO_PLATFORM_CONFIG

定义后,不选择或包含任何平台配置文件;当平台完全符合标准(并且没有有用的额外功能)时,或者用户头文件(请参阅 BOOST_USER_CONFIG)已添加任何必要的选项时定义,例如通过 autoconf 生成的 configure 脚本。

BOOST_NO_CONFIG

等同于定义所有 BOOST_NO_COMPILER_CONFIGBOOST_NO_STDLIB_CONFIGBOOST_NO_PLATFORM_CONFIG

BOOST_STRICT_CONFIG

对于比上次已知版本更新的编译器版本,正常行为是假定它们具有与上次已知版本相同的所有缺陷。通过设置此定义,则假定比上次已知版本更新的编译器版本完全符合标准。这对于 Boost 开发者或测试人员以及那些想要使用 Boost 测试 beta 编译器版本的人员来说可能最有用。

BOOST_ASSERT_CONFIG

设置此标志后,如果配置找到任何未知内容,它将停止并显示 #error 而不是继续。Boost 回归测试人员应设置此定义,任何想要快速检查 Boost 是否在其平台上受支持的人员也应设置此定义。

BOOST_DISABLE_THREADS

定义后,即使编译器在其当前转换模式下支持多线程,也会禁用线程支持。

BOOST_DISABLE_WIN32

定义后,即使 Win32 特定 API 可用,也会禁用它们的使用。除非设置了 BOOST_HAS_PTHREADS,否则也具有设置 BOOST_DISABLE_THREADS 的效果。当配置系统检测到编译器处于“严格模式”时,可能会自动设置此选项。

BOOST_DISABLE_ABI_HEADERS

阻止 Boost 头文件包含任何通常控制结构体填充和对齐等内容的前缀/后缀头文件。

BOOST_ABI_PREFIX

一个前缀头文件,用于代替 boost.config 通常选择的任何内容包含,任何替换都应根据需要设置结构体填充和对齐选项。

BOOST_ABI_SUFFIX

一个后缀头文件,用于代替 boost.config 通常选择的任何内容包含,任何替换都应撤消前缀头文件的效果。

BOOST_ALL_DYN_LINK

强制所有具有独立源代码的库在 Microsoft Windows 上链接为 dll 而不是静态库(此宏用于启用 __declspec(dllimport) 修饰符,以便编译器知道在 dll 而不是静态库中查找哪些符号)。请注意,可能有些库只能静态链接(例如 Boost.Test),而另一些库可能只能动态链接(例如 Boost.Thread),在这些情况下,此宏无效。

BOOST_WHATEVER_DYN_LINK

强制库“whatever”在 Microsoft Windows 上链接为 dll 而不是静态库:将宏名称的 WHATEVER 部分替换为你想要动态链接到的库的名称,例如使用 BOOST_DATE_TIME_DYN_LINKBOOST_REGEX_DYN_LINK 等(此宏用于启用 __declspec(dllimport) 修饰符,以便编译器知道在 dll 而不是静态库中查找哪些符号)。请注意,可能有些库只能静态链接(例如 Boost.Test),而另一些库可能只能动态链接(例如 Boost.Thread),在这些情况下,此宏不受支持。

BOOST_ALL_NO_LIB

告诉配置系统不要自动选择要链接的库。通常,如果编译器支持 #pragma lib,那么只需包含该库的头文件之一,即可自动选择并链接正确的库构建变体。此宏会关闭该功能。

BOOST_WHATEVER_NO_LIB

告诉配置系统不要自动选择要链接到库“whatever”的库,将宏名称中的 WHATEVER 替换为库的名称;例如 BOOST_DATE_TIME_NO_LIBBOOST_REGEX_NO_LIB。通常,如果编译器支持 #pragma lib,那么只需包含该库的头文件之一,即可自动选择并链接正确的库构建变体。此宏会关闭该功能。

BOOST_LIB_DIAGNOSTIC

使自动链接代码输出诊断消息,指示为链接选择的库的名称。

BOOST_LIB_BUILDID

如果你使用 --buildid 选项构建了 Boost,则将此宏设置为与你传递给 bjam 的值相同的值。例如,如果你使用 bjam address-model=64 --buildid=amd64 构建,然后使用 -DBOOST_LIB_BUILDID=amd64 编译你的代码,以确保在链接时选择正确的库。

BOOST_LIB_TOOLSET

覆盖要链接到的库的名称的工具集部分的名称;请注意,如果定义了此项,则必须将其定义为带引号的字符串文字,例如“abc”。

通过在编译器命令行上设置各种宏或编辑 <boost/config/user.hpp>,可以以多种方式优化 Boost 配置设置。

Boost 的配置结构化为首先包含用户配置(如果未定义 BOOST_USER_CONFIG,则默认为 <boost/config/user.hpp>)。这会设置任何用户定义的策略,并使用户配置有机会影响接下来发生的事情。

接下来,包含编译器、标准库和平台配置文件。这些文件通过宏(BOOST_COMPILER_CONFIG 等,请参阅用户可设置的宏)包含,如果相应的宏未定义,则包含一个单独的头文件,该文件检测正在使用的编译器/标准库/平台,以便设置这些文件。如果设置了相应的 BOOST_NO_XXX 宏(例如 BOOST_NO_COMPILER_CONFIG 以禁用包含任何编译器配置文件 - 请参阅用户可设置的宏),则可以告知配置完全忽略这些头文件。

最后,Boost 配置文件包含 <boost/config/detail/suffix.hpp>;此头文件包含任何样板配置代码 - 例如,其中一个 Boost 宏的设置意味着还必须设置另一个宏。

以下用法示例仅代表几种可能性

假设我们正在使用 Visual C++ 6 和 STLport 4.0 构建 Boost。还假设我们不打算很快更新我们的编译器或标准库。为了避免在更新 Boost 时破坏依赖关系,我们可能希望“冻结”我们的配置头文件,以便我们只需要在 Boost 代码本身已更改时才重建我们的项目,而不是因为 Boost 配置已针对更新版本的 Visual C++ 或 STLport 进行了更新。我们将首先意识到正在使用的配置文件是:<boost/config/compiler/visualc.hpp> 用于编译器,<boost/config/stdlib/stlport.hpp> 用于标准库,以及 <boost/config/platform/win32.hpp> 用于平台。接下来,我们将创建我们自己的私有配置目录:boost/config/mysetup/,并将配置文件复制到那里。最后,打开 <boost/config/user.hpp> 并编辑以下定义

#define BOOST_COMPILER_CONFIG "boost/config/mysetup/visualc.hpp"
#define BOOST_STDLIB_CONFIG "boost/config/mysetup/stlport.hpp"
#define BOOST_USER_CONFIG "boost/config/mysetup/win32.hpp"

现在,当你使用 Boost 时,其配置头文件将直接转到我们的“冻结”版本,并忽略默认版本,现在你将免受更新 Boost 时的任何配置更改的影响。如果你想修改某些 Boost 配置文件,此技术也很有用;例如,如果你正在使用 Boost 尚不支持的 beta 编译器版本。

假设你正在使用完全符合标准的编译器使用 Boost;你对旧版本的编译器可能存在的错误不感兴趣,因为你知道你当前的版本不需要设置任何配置宏。在这种情况下,你可以在命令行或 <boost/config/user.hpp> 中定义 BOOST_NO_COMPILER_CONFIG,并完全忽略编译器配置文件(实际上你忽略了两个头文件,一个用于确定编译器是什么,另一个用于为其配置 Boost)。这有两个后果:第一个是必须编译的代码更少,第二个是你删除了对两个 Boost 头文件的依赖。

如果你在类似 unix 的平台上工作,那么你可以使用 configure 脚本根据你当前的编译器设置生成“冻结”配置 - 请参阅使用 configure 脚本了解更多详细信息

Boost 配置库在 <boost-root>/boost/config/ test/ 子目录下提供了一整套回归测试程序

文件

描述

config_info.cpp

打印出你的编译器/标准库/平台设置以及当前 Boost 配置的详细描述。此程序提供的信息对于设置 Boost 配置文件很有用。如果你报告 Boost 为你的编译器/库/平台配置不正确,那么请在报告所需的更改时包含此程序的输出。

config_test.cpp

一个包含大多数单独测试用例的单体测试程序。这提供了一个快速检查,以查看 Boost 是否为你的编译器/库/平台正确配置。

limits_test.cpp

测试你的标准库的 std::numeric_limits 实现(如果定义了 BOOST_NO_LIMITS,则测试 Boost 提供的替换项)。此测试文件在大多数版本的 numeric_limits 中都会失败,主要是由于某些编译器处理 NAN 和 infinity 的方式。

no_*pass.cpp

单个编译器缺陷测试文件。如果其中一个文件无法编译,则需要定义相应的 BOOST_NO_XXX 宏 - 请参阅每个测试文件以获取具体详细信息。

no_*fail.cpp

单个编译器缺陷测试文件。如果其中一个文件可以编译,则在不需要时定义了相应的 BOOST_NO_XXX 宏 - 请参阅每个测试文件以获取具体详细信息。

has_*pass.cpp

单个特性测试文件。如果其中一个文件无法编译,则在不应定义时定义了相应的 BOOST_HAS_XXX 宏 - 请参阅每个测试文件以获取具体详细信息。

has_*fail.cpp

单个特性测试文件。如果其中一个文件可以编译,则可以安全地定义相应的 BOOST_HAS_XXX 宏 - 请参阅每个测试文件以获取具体详细信息。

虽然你可以将配置回归测试作为单独的测试文件运行,但是它们数量相当多,因此这里提供了一些快捷方式来帮助你。

或者你可以像这样运行 configure 脚本

./configure --enable-test

在这种情况下,该脚本将测试当前配置,而不是从头开始创建一个新的配置。

如果你要报告针对新的平台、库或编译器的这些测试的结果,那么请包含完整的编译器输出日志,来自 config_info.cpp 的输出,以及通过/失败的测试结果。


Next