跳至主要內容

Boost

LincZero大约 9 分钟

Boost

目录

入门

学习参考

PDF

  • Boost库学习指南.pdf
  • Boost库官方完全翻译最详细教程.pdf(但只有三章)
  • Boost程序库完全开发指南:深入C++“准”标准库 第4版.pdf(很厚的一本书、深入)
  • Learning Boost C++ Libraries.pdf(没有翻译)

网站

  • http://zh.highscore.de/cpp/boost/(主要参考)
  • [官方网站](https://www.boost.org/)
  • [官网文档](https://www.boost.org/doc/libs/1_78_0/)(推荐从官网主页进入)

下载和编译 Boost

流程简概

Boost C++ 库均带有源代码。其中大多数库只包含头文件,可以直接使用,但也有一些库需要编译。

下载

去官方网站下载,有Unix版本和Windows版本,下载后解压

[官方网站](https://www.boost.org/)

解压

boost_1_78_0
├─ (bin.v2)					# 运行b2.exe后生成,文件夹非常大
├─ boost			# 里面有各种库
│  ├─ any
│  │  any.hpp
│  └─ ...
├─ doc
├─ libs
├─ more
├─ (status)					# 运行b2.exe后生成
├─ status
├─ tools
│  ├─ build/src/engine/b2.exe	# 这两个exe文件是一样的,但和根的那个b2.exe不同
│  └─ build/src/engine/bjam.ex	# 这两个exe文件是一样的,但和根的那个b2.exe不同(b2.exe)					# 运行booststrap之后才会出现这个文件,默认安装再点击这个Build Boost C++ Libraries.
│  boost.css
│  boost.png
│  boost-build.jam
│  boostcpp.jam
│  bootstrap.bat	# Windows运行这个编译 bjam
│  bootstrap.sh	# Linux运行这个 bjam
│  index.htm
│  index.html
│  INSTALL
│  Jamroot
│  LICENSE_1_0.txt
│  (project-config.jam)		# 运行b2.exe后生成
│  README.md
│  rst.css

安装

(听不懂)

为了尽可能容易安装,可以使用 Boost Jam 进行自动安装。无需逐个库进行检查和编译,Boost Jam自动安装整个库集。 它支持许多操作系统和编译器,并且知道如何基于适当的配置文件来编译单个库。

为了在 Boost Jam 的帮助下自动安装,要使用一个名为 bjam 的应用程序,它也带有源代码。 对于某些操作系统,包括 Windows 和 Linux,也有预编译好的 bjam 二进制文件。

为了编译 bjam 本身,要执行一个名为 build 的简单脚本,它也为不同的操作系统提供了源代码。 对于 Windows,它是批处理文件 build.bat。 对于 Linux,文件名为 build.sh

如果执行 build 时不带任何命令行选项,则该脚本尝试找到一个合适的编译器来生成 bjam。 通过使用命令行开关,称为 toolset,可以选择特定的编译器。 对于 Windows,build 支持 toolsets vc7, vc8vc9,可以选择不同版本的 Microsoft C++ 编译器。 要从 Visual Studio 2008 的C++编译器编译 bjam,需要指定命令 build vc9。对于 Linux,支持 toolsets gccintel-linux,分别选定 GCC 和 Intel 的C++编译器。

应用程序 bjam 必须复制到本地的 Boost 目录 - 不论它是编译出来的还是下载的预编译二进制文件。 然后就可以不带任何命令行选项地执行 bjam,编译并安装 Boost C++ 库。 由于缺省选项 - 在这种情况下所使用的 - 并不一定是最好的选择,所以以下列出最重要的几个选项供参考:

  • 声明 stageinstall 可以指定 Boost C++ 库是安装在一个名为 stage 的子目录下,还是在系统范围内安装。 "系统范围"的意义取决于操作系统。 在 Windows 中,目标目录是 C:\Boost;而在 Linux 中则是 /usr/local。 目标目录也可以用 --prefix 选项明确指出。
  • 如果不带任何命令行选项执行 bjam,则它会自己搜索一个合适的C++编译器。 可以通过 --toolset 选项来指定一个特定的编译器。 要在 Windows 中指定 Visual Studio 2008 的 Microsoft C++ 编译器,bjam 执行时要带上 --toolset=msvc-9.0 选项。 要在 Linux 中指定 GCC 编译器,则要给出 --toolset=gcc 选项。
  • 命令行选项 --build-type 决定了创建何种方式的库。 缺省情况下,该选项设为 minimal,即只创建发布版。 对于那些想用 Visual Studio 或 GCC 构建他们项目的调试版的开发者来说,可能是一个问题。 因为这些编译器会自动尝试链接调试版的 Boost C++ 库,这样就会给出一个错误信息。 在这种情况下,应将 --build-type 选项设为 complete,以同时生成 Boost C++ 库的调试版和发布版,当然,所需时间也会更长一些。

要用 Visual Studio 2008 的C++编译器同时生成 Boost C++ 库的调试版和发布版,并将它们安装在目录 D:\Boost 中,应执行的命令是 bjam --toolset=msvc-9.0 --build-type=complete --prefix=D:\Boost install. 要在 Linux 中使用缺省目录创建它们,则要执行的命令是 bjam --toolset=gcc --build-type=complete install.

其它多个命令行选项可用于指定如何编译 Boost C++ 库的一些细节设定。

我通常在 Windows 下使用以下命令:bjam --toolset=msvc-9.0 debug release link=static runtime-link=shared install. debugrelease 使得调试版和发布版均被生成。 link=static 则只创建静态库。 runtime-link=shared 则是指定 C++ 运行时库是动态链接的,这是在 Visual Studio 2008 中对C++项目的缺省设置。

windows下安装和编译(简化版)

  1. 不要直接双击bootstrap.bat,要在MSVC命令行中调用bat文件。 VS:开始菜单 > Visual Studio 2019 > 找到**Developer Command Prompt...打开 QT:找到Qt 6.0.3 (MSVC 2019 64-bit)**打开 命令行中cd到boost解压路径并执行 bootstrap.bat (我个人放在了 D:\Soft\Dev\Language\C++\boost_1_78_0)
  2. 然后依然是在MSVC命令行中调用bjam.exe

Bjam参数

bjam install 					# stage/install:stage只生成库、install还会生成包含头文件的include目录,但编译时间更长。默认stage
	--toolset=msvc-14.0			# 指定编译器,可选的如borland、gcc、msvc-14.0(VS2025)等
	--without-python			# --build-type/without/with:complete编译所有boost库,默认complete。without/with选择不编译/编译哪些库	查看boost包含库的命令是bjam --show-libraries
	--prefix="E:\Learning\Boost"# --stagedir/prefix:stage时用stagedir,install时用prefix。表示编译生成文件的路径
	link=static					# 生成动态/静态链接库。参数static仅生成lib文件,参数shared生成lib和dll文件
	runtime-link=shared			# 动态/静态链接C/C++运行时库。参数static或shared
	threading=multi				# 单/多线程编译。现在基本都是multi方式
	address-model=64			# 64/32位平台,不填就都编译
	debug						# debug/release,不填就都编译

不知道为什么,--prefix参数似乎不管用

  • install命令生成在C:\Boost,里面有include和lib文件
  • stage命令生成在D:\Soft\Dev\Language\C++\boost_1_78_0\stage,里面只有lib文件

库的概述

Boost C++ 库的 1.42.0 版本包含了超过90个库,中文站中只详细讨论了以下各库:

Boost C++ 库C++ 标准简要说明
Boost.Anyopen in new windowBoost.Any 提供了一个名为 boost::any 的数据类型,可以存放任意的类型。 例如,一个类型为 boost::any 的变量可以先存放一个 int 类型的值,然后替换为一个 std::string 类型的字符串。
Boost.Arrayopen in new windowTR1Boost.Array 可以把 C++ 数组视同 C++ 标准的容器。
Boost.Asioopen in new windowTR2Boost.Asio 可用于开发异步处理数据的应用,如网络应用。
Boost.Bimapopen in new windowBoost.Bimap 提供了一个名为 boost::bimap 的类,它类似于 std::map. 主要的差别在于 boost::bimap 可以同时从键和值进行搜索。
Boost.Bindopen in new windowTR1Boost.Bind 是一种适配器,可以将函数作为模板参数,即使该函数的签名与模板参数不兼容。
Boost.Conversionopen in new windowBoost.Conversion 提供了三个转型操作符,分别执行向下转型、交叉转型,以及不同数字类型间的值转换。
Boost.DateTimeopen in new windowBoost.DateTime 可用于以灵活的格式处理、读入和写出日期及时间值。
Boost.Exceptionopen in new windowBoost.Exception 可以在抛出的异常中加入额外的数据,以便在 catch 处理中提供更多的信息。 这有助于更容易地调试,以及对异常情况更好地作出反应。
Boost.Filesystemopen in new windowTR2Boost.Filesystem 提供了一个类来处理路径信息,还包含了几个访问文件和目录的函数。
Boost.Formatopen in new windowBoost.Format 以一个类型安全且可扩展的 boost::format 类替代了 std::printf() 函数。
Boost.Functionopen in new windowTR1Boost.Function 简化了函数指针的定义。
Boost.Interprocessopen in new windowBoost.Interprocess 允许多个应用通过共享内存以快速、高效的方式进行通信。
Boost.Lambdaopen in new windowBoost.Lambda 可以定义匿名的函数。 代码被内联地声明和执行,避免了单独的函数调用。
Boost.Multiindexopen in new windowBoost.Multiindex 定义了一些新的容器,它们可以同时支持多个接口,如 std::vectorstd::map 的接口。
Boost.NumericConversionopen in new windowBoost.NumericConversion 提供了一个转型操作符,可以安全地在不同的数字类型间进行值转换,不会生成上溢出或下溢出的条件。
Boost.PointerContaineropen in new windowBoost.PointerContainer 提供了专门为动态分配对象进行优化的容器。
Boost.Refopen in new windowTR1Boost.Ref 的适配器可以将不可复制对象的引用传给需要复制的函数。
Boost.Regexopen in new windowTR1Boost.Regex 提供了通过正则表达式进行文本搜索的函数。
Boost.Serializationopen in new window通过 Boost.Serialization,对象可以被序列化,如保存在文件中,并在以后重新导入。
Boost.Signalsopen in new windowBoost.Signal 是一个事件处理的框架,基于所谓的 signal/slot 概念。 函数与信号相关联并在信号被触发时自动被调用。
Boost.SmartPoinersopen in new windowTR1Boost.SmartPoiners 提供了多个智能指针,简化了动态分配对象的管理。
Boost.Spiritopen in new windowBoost.Spirit 可以用类似于 EBNF (扩展巴科斯范式)的语法生成词法分析器。
Boost.StringAlgorithmsopen in new windowBoost.StringAlgorithms 提供了多个独立的函数,以方便处理字符串。
Boost.Systemopen in new windowTR2Boost.System 提供了一个处理系统相关或应用相关错误代码的框架。
Boost.Threadopen in new windowC++0xBoost.Thread 可用于开发多线程应用。
Boost.Tokenizeropen in new windowBoost.Tokenizer 可以对一个字符串的各个组件进行迭代。
Boost.Tupleopen in new windowTR1Boost.Tuple 提供了泛化版的 std::pair,可以将任意数量的数据组在一起。
Boost.Unorderedopen in new windowTR1Boost.Unordered 扩展了 C++ 标准的容器,增加了boost::unordered_setboost::unordered_map.
Boost.Variantopen in new windowBoost.Variant 可以定义多个数据类型,类似于 union, 将多个数据类型组在一起。 Boost.Variant 比 union 优胜的地方在于它可以使用类。