Boost C++ 库

...世界上最受尊敬和专业设计的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ 编码标准

PrevUpHomeNext

安装与兼容性

支持的编译器和平台
配置和构建库

该库应该能够使用符合 C++11 标准的编译器构建和工作。该库已在以下平台成功构建和测试

  • Windows 10。MSVC 14.0 及更高版本。MinGW32,gcc 5.x;MinGW-w64,gcc 6.x 及更高版本。
  • Cygwin 和 Cygwin64,gcc 7.x 及更高版本。
  • Linux。GCC 5.x 及更高版本。
  • Linux。Clang 3.5 及更高版本。

以下编译器/平台不受支持,可能无法编译该库

  • 不支持 C++11 的编译器。
  • 使用非 C++11 标准库的 C++11 编译器(例如使用 GCC 4.2 的 libstdc++ 的 Clang)。请在 C++11 模式下使用 C++11 标准库。
  • MSVC 12.0 及更早版本。
  • GCC 4.4 及更早版本。
  • Borland C++ 5.5.1(免费版本)。更新的版本可能可以工作,也可能无法工作。
  • Solaris Studio 12.3 及更早版本。
  • 不支持 Windows 9x、ME、NT4、2000 及更早版本。

Boost.Log 应该兼容 Boost 支持的所有硬件架构。但是,对于 32 位 x86 架构,该库至少需要 i586 级别的 CPU 才能运行。

GCC 用户注意事项

自 4.5 版本以来,GCC 版本支持链接时优化 (LTO),其中大多数优化和二进制代码生成发生在链接阶段。这允许执行更高级的优化并生成更快的代码。不幸的是,它与包含需要使用不同编译器选项编译的源文件的项目不能很好地配合。Boost.Log 就是这样的项目之一,其某些部分的源代码包含针对现代 CPU 的优化,并且无法在较旧的 CPU 上运行。为 Boost.Log 启用 LTO 将产生与较旧的 CPU 不兼容的二进制文件(GCC 错误 61043, 77845),这可能会导致运行时崩溃。因此,Boost.Log 不支持 LTO。

GCC 存在一个错误,当使用 -march=native 命令行参数时,可能会导致编译失败。建议避免使用 -march=native 参数(或 instruction-set=native b2 属性),而是显式指定目标 CPU(例如 instruction-set=sandy-bridge)。

MinGW、Cygwin 和 Visual Studio Express Edition 用户注意事项

为了使用这些编译器编译库,需要进行特殊准备。首先,如果使用 MinGW 或 Cygwin,请确保您已安装最新的 GCC 版本。该库很可能无法使用 GCC 3.x 编译。

其次,在某些时候,该库将需要消息编译器工具 (mc.exe),这在 MinGW、Cygwin 和某些版本的 MSVC Express Edition 中不可用。通常,库构建脚本将自动检测系统上是否存在消息编译器,如果不存在,则禁用库中与事件日志相关的部分。如果需要事件日志支持,但在系统上找不到,您有三个选项来解决此问题。推荐的解决方案是获取原始的 mc.exe。此工具在 Windows SDK 中可用,可以从 Microsoft 站点免费下载(例如,此处)。此外,此工具应该在 Visual Studio 2010 Express Edition 中可用。在编译期间,mc.exe 应该可以通过 PATH 环境变量中的一个目录访问。

另一种方法是尝试使用 MinGW 和 Cygwin 分发的 windmc.exe 工具,它是原始 mc.exe 的类似物。为了做到这一点,您必须修补 Boost.Build 文件(特别是 tools/build/tools/mc.jam 文件),如 本工单中所述。之后,您将能够指定 mc-compiler=windmc 选项给 b2 来构建库。

如果由于某种原因消息编译器检测失败,您可以通过在构建库时定义 BOOST_LOG_WITHOUT_EVENT_LOG 配置宏来显式禁用对事件日志后端 的支持。这将消除对消息编译器的需求。有关更多配置选项,请参阅 本节

Windows XP 上的 MinGW 用户可能会受到操作系统捆绑的 msvcrt.dll 中的 错误的影响。该错误表现为库格式化日志记录时崩溃。此问题并非 Boost.Log 特有,也可能在与区域设置和 IO 流管理相关的不同上下文中出现。

Cygwin 用户附加说明

Cygwin 支持非常初步。Cygwin 中可用的默认 GCC 版本(截至撰写本文时为 4.5.3)由于编译器错误而无法编译该库。您将必须从源代码构建更新的 GCC。即使这样,某些 Boost.Log 功能仍然不可用。特别是,不支持基于套接字的 syslog 后端,因为它基于 Boost.ASIO,而 Boost.ASIO 在此平台上无法编译。但是,本机 syslog 支持仍然存在。


PrevUpHomeNext