版权所有 © 2001-2007 Beman Dawes, Vesa Karvonen, John Maddock
根据 Boost 软件许可协议 1.0 版本分发。(请参阅随附文件 LICENSE_1_0.txt 或在 https://boost.ac.cn/LICENSE_1_0.txt 复制)
Boost 已经为大多数常见的编译器和平台配置完毕;你应该能够“按原样”使用 Boost。由于编译器与标准库是分开配置的,即使你用第三方标准库(如 STLport)替换编译器的标准库,默认配置也应该可以工作。
“按原样”使用 Boost 而不尝试重新配置是使用 Boost 的推荐方法。但是,如果你愿意,可以运行 configure 脚本,并且提供了回归测试,允许你使用特定的编译器设置测试当前的 Boost 配置。
Boost 库用户可以通过访问我们的 Github 并提交支持请求,来请求对其他编译器或平台的支持。
Boost 库实现通过以下方式访问配置宏
#include <boost/config.hpp>
虽然 Boost 库用户不需要直接包含该文件或使用这些配置宏,但这种使用方式是可以接受的。配置宏的用途、用法和限制都有文档记录,这使得它们可以被 Boost 库和用户代码使用。
Boost 信息 或 辅助 宏旨在供 Boost 用户以及我们自己的内部使用。但请注意,特性测试 和 缺陷测试 宏是为 Boost 库的内部使用而设计的,而不是用户代码,因此它们可能随时更改(尽管不会对它们进行无意义的更改)。配置宏更改导致的 Boost 库问题会被 Boost 回归测试捕获,因此 Boost 库会更新以解决这些更改。相比之下,Boost 库用户代码可能会在没有警告的情况下受到宏更改的不利影响。了解用户代码中使用的宏更改的最佳方法是监控 Boost 开发者列表上的讨论。
![]() |
重要提示 |
---|---|
此 configure 脚本仅设置 Boost 头文件以供特定编译器使用。它对 Boost.Build 或库的构建方式没有影响。 |
如果你知道 Boost 为你的特定设置配置不正确,并且你位于类似 UNIX 的平台上,那么你可能想尝试通过运行 Boost configure 脚本来改进。从 shell 命令提示符下,你需要 cd 进入 <boost-root>/libs/config/
并输入
sh ./configure
你将看到脚本在完成回归测试时正在检查的项目列表。请注意,configure 脚本仅在调用 g++、c++ 或 CC 时真正自动检测你的编译器。如果你正在使用其他编译器,则需要设置以下一个或多个环境变量
变量 |
描述 |
---|---|
CXX |
编译器的名称,例如 |
CXXFLAGS |
要使用的编译器标志,例如 |
LDFLAGS |
要使用的链接器标志,例如 |
LIBS |
要链接的任何库,例如 |
例如,要使用 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/
下)。 你可以通过两种方式使用此头文件
/boost/config/
,以便它替换 Boost 提供的默认 user.hpp。此选项仅允许一个 configure 生成的设置;Boost 开发者应避免此选项,因为它存在意外提交 configure 修改的 <boost/config/user.hpp> 到 svn 存储库的风险(你不会因此而受到感谢!)。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 配置文件之前包含。未定义时,默认为 |
|
定义后,它应指向要使用的编译器配置文件的名称。定义此项会切断编译器选择逻辑,并消除对包含该逻辑的头文件的依赖。例如,如果你正在使用 gcc,则可以将 BOOST_COMPILER_CONFIG 定义为 |
|
定义后,它应指向要使用的标准库配置文件的名称。定义此项会切断标准库选择逻辑,并消除对包含该逻辑的头文件的依赖。例如,如果你正在使用 STLport,则可以将 |
|
定义后,它应指向要使用的平台配置文件的名称。定义此项会切断平台选择逻辑,并消除对包含该逻辑的头文件的依赖。例如,如果你在 linux 上编译,则可以将 |
|
定义后,不选择或包含任何编译器配置文件;当编译器完全符合标准时,或者用户头文件(请参阅 |
|
定义后,不选择或包含任何标准库配置文件;当标准库完全符合标准时,或者用户头文件(请参阅 |
|
定义后,不选择或包含任何平台配置文件;当平台完全符合标准(并且没有有用的额外功能)时,或者用户头文件(请参阅 |
|
等同于定义所有 |
|
对于比上次已知版本更新的编译器版本,正常行为是假定它们具有与上次已知版本相同的所有缺陷。通过设置此定义,则假定比上次已知版本更新的编译器版本完全符合标准。这对于 Boost 开发者或测试人员以及那些想要使用 Boost 测试 beta 编译器版本的人员来说可能最有用。 |
|
设置此标志后,如果配置找到任何未知内容,它将停止并显示 #error 而不是继续。Boost 回归测试人员应设置此定义,任何想要快速检查 Boost 是否在其平台上受支持的人员也应设置此定义。 |
|
定义后,即使编译器在其当前转换模式下支持多线程,也会禁用线程支持。 |
|
定义后,即使 Win32 特定 API 可用,也会禁用它们的使用。除非设置了 |
|
阻止 Boost 头文件包含任何通常控制结构体填充和对齐等内容的前缀/后缀头文件。 |
|
一个前缀头文件,用于代替 boost.config 通常选择的任何内容包含,任何替换都应根据需要设置结构体填充和对齐选项。 |
|
一个后缀头文件,用于代替 boost.config 通常选择的任何内容包含,任何替换都应撤消前缀头文件的效果。 |
|
强制所有具有独立源代码的库在 Microsoft Windows 上链接为 dll 而不是静态库(此宏用于启用 |
|
强制库“whatever”在 Microsoft Windows 上链接为 dll 而不是静态库:将宏名称的 WHATEVER 部分替换为你想要动态链接到的库的名称,例如使用 |
|
告诉配置系统不要自动选择要链接的库。通常,如果编译器支持 #pragma lib,那么只需包含该库的头文件之一,即可自动选择并链接正确的库构建变体。此宏会关闭该功能。 |
|
告诉配置系统不要自动选择要链接到库“whatever”的库,将宏名称中的 WHATEVER 替换为库的名称;例如 |
|
使自动链接代码输出诊断消息,指示为链接选择的库的名称。 |
|
如果你使用 |
|
覆盖要链接到的库的名称的工具集部分的名称;请注意,如果定义了此项,则必须将其定义为带引号的字符串文字,例如“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/
子目录下提供了一整套回归测试程序
文件 |
描述 |
---|---|
|
打印出你的编译器/标准库/平台设置以及当前 Boost 配置的详细描述。此程序提供的信息对于设置 Boost 配置文件很有用。如果你报告 Boost 为你的编译器/库/平台配置不正确,那么请在报告所需的更改时包含此程序的输出。 |
|
一个包含大多数单独测试用例的单体测试程序。这提供了一个快速检查,以查看 Boost 是否为你的编译器/库/平台正确配置。 |
|
测试你的标准库的 |
|
单个编译器缺陷测试文件。如果其中一个文件无法编译,则需要定义相应的 |
|
单个编译器缺陷测试文件。如果其中一个文件可以编译,则在不需要时定义了相应的 |
|
单个特性测试文件。如果其中一个文件无法编译,则在不应定义时定义了相应的 |
|
单个特性测试文件。如果其中一个文件可以编译,则可以安全地定义相应的 |
虽然你可以将配置回归测试作为单独的测试文件运行,但是它们数量相当多,因此这里提供了一些快捷方式来帮助你。
或者你可以像这样运行 configure 脚本
./configure --enable-test
在这种情况下,该脚本将测试当前配置,而不是从头开始创建一个新的配置。
如果你要报告针对新的平台、库或编译器的这些测试的结果,那么请包含完整的编译器输出日志,来自 config_info.cpp
的输出,以及通过/失败的测试结果。