文章目录

一、Boost库简介

Boost库 是一个功能强大 , 构造精良 , 跨越平台 , 代码开源 , 完全免费的 C ++
开源程序库。它使得C++编程更优雅、更有活力、更高产,C++11的标准有三分之二来自boost库。在boost1.57版本时,就一共包含了129个组件,分为25个大类,涵盖了文本处理,容器,迭代器,算法,图像处理,模板元编程,并发编程等许多领域。
Boost库是为C++语言标准库提供扩展的一些C++程序库的总称,由Boost社区组织开发、维护。Boost库可以与C++标准库完美共同工作,并且为其提供扩展功能。
中文名:Boost库

本    质:C++程序库 

开发者:Boost社区

目    的:为C++程序员提供免费的程序库

功    能:为C++语言标准库提供扩展

释    义:是为C++语言标准库提供扩展的一些C++程序库的总称

1、功能强大:

共包含 160 余个库 / 组件 , 涵盖字符串与文本处理、容器、迭代器、算法、图像处理、模板元编程、并发编程等多个领域。

2、构造精良:

由 c ++ 标准委员会成员发起倡议并建立 boost 社区 , C ++11 标准库中三分之二来自 boost ,
并且将来还会有更多的库进入 c ++ 标准库 , 因此 boost 是一个 c ++ " 准 " 标准库。

3、跨越平台:

支持现有的所有操作系统。Windows、Linux、UniX,包括UNIX和Windows变体。

4、代码开源,完全免费:

Boost的发布采用Boost Software
License,这是一个不同于GPL和Apache的非常宽松的许可证(许可证相关知识可查看秒懂开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别),该许可证允许库用户将Boost用于任何用途,既鼓励非商业用途,也鼓励商业用途。用户无须支付任何费用,不受任何限制,即可轻松享有Boost的全部功能。

5、Boost库的大多数组件不需要编译链接。

我们在自己的源码里直接包含头文件即可。(注意:包含头文件的时候需要有boost目录,即#include
“boost/logic/tribool.hpp”,而不能是#include
“logic/tribool.hpp”)剩下的少量库(如chrono、date_time、program_options、test、thread等)必须编译成静态库或动态库,并在构建时指定链接选项才能使用。

6、Boost的独特之处:

它把C++类的声明和实现放在了一个文件中,而不是分成两个文件,即.h+.cpp,故文件的后缀是.hpp。
hpp(Header plus plus)头文件,顾名思义等于.h加上cpp,在boost开源库中频繁出现,其 实质就是将cpp的实现代码混入.h头文件当中 ,定义实现都包含在同一文件。

   hpp文件的优点:
       1、hpp文件将定义与实现都包含在同一文件;减少文件的数里。
       2、无需再将cpp加入到项目中进行编译,将代码直接编译到调用者的obj文件中,不再生成单独的obj,大幅度减少编译次数,非常适合编写开源库。
       3、Boost库大量使用模板,采用hpp的形式可以保持与各个扁译器更好的兼容性。

7、分类

    按照实现的功能,Boost可为大致归入以下 20 个分类,在下面的分类中,有些库同时归入几种类别。        

Boost可为大致归入以下分类:

        字符串和文本处理库

        容器库

        迭代器库

        算法库

        函数对象和高阶编程库

        泛型编程

        模板元编程

        预处理元编程

        并发编程

        数学和数字

        排错和测试

        数据结构

        图像处理

        输入输出

        跨语言混合编程

        内存管理

        解析

        编程接口

        杂项

        编译器问题的变通方案

1、字符串和文本处理库

        a) Conversion库:对C++类型转换的增强,提供更强的类型安全转换、更高效的类型安全保护、进行范围检查的数值转换和词法转换。

        b) Format库:实现类似printf的格式化对象,可以把参数格式化到一个字符串,而且是完全类型安全的。

        c) IOStream库 :扩展C++标准库流处理,建立一个流处理框架。

        d) Lexical Cast库:用于字符串、整数、浮点数的字面转换。

        e) Regex 库:正则表达式,已经被TR1所接受。

        f) Spirit库:基于EBNF范式的LL解析器框架

        g) String Algo库:一组与字符串相关的算法

        h) Tokenizer库:把字符串拆成一组记号的方法

        i) Wave库:使用spirit库开发的一个完全符合C/C++标准的预处理器

        j) Xpressive 库:无需编译即可使用的正则表达式库

2、容器库

        a) Array 库:对C语言风格的数组进行包装

        b) Bimap 库:双向映射结构库

        c) Circular Buffer 库:实现循环缓冲区的数据结构

        d) Disjoint Sets库 :实现不相交集的库

        e) Dynamic Bitset 库:支持运行时调整容器大小的位集合

        f) GIL 库:通用图像库

        g) Graph 库:处理图结构的库

        h) ICL 库:区间容器库,处理区间集合和映射

        i) Intrusive 库:侵入式容器和算法

        j) Multi-Array 库:多维容器

        k) Multi-Index 库:实现具有多个STL兼容索引的容器

        l) Pointer Container 库:容纳指针的容器

        m) Property Map 库:提供键/值映射的属性概念定义

        n) Property Tree 库:保存了多个属性值的树形数据结构

        o) Unordered 库:散列容器,相当于hash_xxx

        p) Variant 库:简单地说,就是持有string, vector等复杂类型的联合体

3、迭代器库

        a) GIL 库:通用图像库

        b) Graph 库:处理图结构的库

        c) Iterators 库:为创建新的迭代器提供框架

        d) Operators 库:允许用户在自己的类里仅定义少量的操作符,就可方便地自动生成其他操作符重载,而且保证正确的语义实现

        e) Tokenizer 库:把字符串拆成一组记号的方法

4、算法库

        a) Foreach库:容器遍历算法

        b) GIL库:通用图像库

        c) Graph库:处理图结构的库

        d) Min-Max库:可在同一次操作中同时得到最大值和最小值

        e) Range库:一组关于范围的概念和实用程序

        f) String Algo库:可在不使用正则表达式的情况下处理大多数字符串相关算法操作

        g) Utility库:小工具的集合

5、函数对象和高阶编程库

        a) Bind库:绑定器的泛化,已被收入TR1

        b) Function库:实现一个通用的回调机制,已被收入TR1

        c) Functional库:适配器的增强版本

        d) Functional/Factory库:用于实现静态和动态的工厂模式

        e) Functional/Forward库:用于接受任何类型的参数

        f) Functional/Hash库:实现了TR1中的散列函数

        g) Lambda库:Lambda表达式,即未命名函数

        h) Member Function库:是STL中mem_fun和mem_fun_ref的扩展

        i) Ref库:包装了对一个对象的引用,已被收入TR1

        j) Result Of库:用于确定一个调用表达式的返回类型,已被收入TR1

        k) Signals库:实现线程安全的观察者模式

        l) Signals2库:基于Signal的另一种实现

        m) Utility库:小工具的集合

        n) Phoenix库:实现在C++中的函数式编程。

6、泛型编程库

        a) Call Traits库:封装可能是最好的函数传参方式

        b) Concept Check库:用来检查是否符合某个概念

        c) Enable If库:允许模板函数或模板类在偏特化时仅针对某些特定类型有效

        d) Function Types库:提供对函数、函数指针、函数引用和成员指针等类型进行分类分解和合成的功能

        e) GIL库:通用图像库

        f) In Place Factory, Typed In Place Factory库:工厂模式的一种实现

        g) Operators库:允许用户在自己的类里仅定义少量的操作符,就可方便地自动生成其他操作符重载,而且保证正确的语义实现

        h) Property Map库:提供键值映射的属性概念定义

        i) Static Assert库:把断言的诊断时刻由运行期提前到编译期,让编译器检查可能发生的错误

        j) Type Traits库:在编译时确定类型是否具有某些特征

        k) TTI库:实现类型萃取的反射功能。

7、模板元编程

        a) Fusion库:提供基于tuple的编译期容器和算法

        b) MPL库:模板元编程框架

        c) Proto库:构建专用领域嵌入式语言

        d) Static Assert库:把断言的诊断时刻由运行期提前到编译期,让编译器检查可能发生的错误

        e) Type Traits库:在编译时确定类型是否具有某些特征

8、预处理元编程库

        a) Preprocessors库:提供预处理元编程工具

9、并发编程库

        a) Asio库:基于操作系统提供的异步机制,采用前摄设计模式实现了可移植的异步IO操作

        b) Interprocess库:实现了可移植的进程间通信功能,包括共享内存、内存映射文件、信号量、文件锁、消息队列等

        c) MPI库:用于高性能的分布式并行开发

        d) Thread库:为C++增加线程处理能力,支持Windows和POSIX线程

        e) Context库:提供了在单个线程上的协同式多任务处理的支持。该库可以用于实现用户级的多任务处理的机制,比如说协程coroutines,用户级协作线程或者类似于C#语言中yield关键字的实现。

[1]

        f) Atomic库:实现C++11样式的atomic<>,提供原子数据类型的支持和对这些原子类型的原子操作的支持。

        g)Coroutine库:实现对协程的支持。协程与线程的不同之处在于,协程是基于合作式多任务的,而多线程是基于抢先式多任务的。

        h)Lockfree库:提供对无锁数据结构的支持。

10、数学和数字库

        a) Accumulators库:用于增量计算的累加器的框架

        b) Integer库:提供一组有关整数处理的类

        c) Interval库:处理区间概念的数学问题

        d) Math库:数学领域的模板类和算法

        e) Math Common Factor库:用于支持最大公约数和最小公倍数

        f) Math Octonion库 :用于支持八元数

        g) Math Quaternion库:用于支持四元数

        h) Math/Special Functions库:数学上一些常用的函数

        i) Math/Statistical Distributions库:用于单变量统计分布操作

        j) Multi-Array库:多维容器

        k) Numeric Conversion库:用于安全数字转换的一组函数

        l) Operators库:允许用户在自己的类里仅定义少量的操作符,就可方便地自动生成其他操作符重载,而且保证正确的语义实现

        m) Random库:专注于伪随机数的实现,有多种算法可以产生高质量的伪随机数

        n) Rational库:实现了没有精度损失的有理数

        o) uBLAS库:用于线性代数领域的数学库

        p) Geometry库:用于解决几何问题的概念、原语和算法。

        q) Ratio库:根据C++ 0x标准N2661号建议 [2]  ,实现编译期的分数操作。

        r)Multiprecision库:提供比C++内置的整数、分数和浮点数精度更高的多精度数值运算功能。 [3] 

        s)Odeint库:用于求解常微分方程的初值问题。 [4] 

11、排错和测试库

        a) Concept Check库 :用来检查是否符合某个概念

        b) Static Assert库 :把断言的诊断时刻由运行期提前到编译期,让编译器检查可能发生的错误

        c) Test库:提供了一个用于单元测试的基于命令行界面的测试套件

12、数据结构库

        a) Any库:支持对任意类型的值进行类型安全的存取

        b) Bimap库:双向映射结构库

        c) Compressed Pair库:优化的对pair对象的存储

        d) Fusion库:提供基于tuple的编译期容器和算法

        e) ICL库:区间容器库,处理区间集合和映射

        f) Multi-Index库:为底层的容器提供多个索引

        g) Pointer Container库:容纳指针的容器

        h) Property Tree库:保存了多个属性值的树形数据结构

        i) Tuple库:元组,已被TR1接受

        j) Uuid库:用于表示和生成UUID

        k) Variant库:有类别的泛型联合类

        l) Heap库:对std::priority_queue扩展,实现优先级队列。

        m) Type Erasure: 实现运行时的多态。

13、图像处理库

        a) GIL库:通用图像库

14、输入输出库

        a) Assign库:用简洁的语法实现对STL容器赋值或者初始化

        b) Format库:实现类似printf的格式化对象,可以把参数格式化到一个字符串,而且是完全类型安全的

        c) IO State Savers库:用来保存流的当前状态,自动恢复流的状态等

        d) IOStreams库:扩展C++标准库流处理,建立一个流处理框架

        e) Program Options库:提供强大的命令行参数处理功能

        f) Serialization库:实现C++数据结构的持久化

15、跨语言混合编程库

        a) Python库:用于实现Python和C++对象的无缝接口和混合编程

16、内存管理库

        a) Pool库:基于简单分隔存储思想实现了一个快速、紧凑的内存池库

        b) Smart Ptr库:智能指针

        c) Utility库:小工具的集合

17、解析库

        a) Spirit库:基于EBNF范式的LL解析器框架

18、编程接口库

        a) Function库:实现一个通用的回调机制,已被收入TR1

        b) Parameter库:提供使用参数名来指定函数参数的机制

19、综合类杂项库

        a) Compressed Pair库:优化的对pair对象的存储

        b) CRC库:实现了循环冗余校验码功能

        c) Date Time 库:一个非常全面灵活的日期时间库

        d) Exception库:针对标准库中异常类的缺陷进行强化,提供<<操作符重载,可以向异常传入任意数据

        e) Filesystem库:可移植的文件系统操作库,可以跨平台操作目录、文件,已被TR2接受

        f) Flyweight 库:实现享元模式,享元对象不可修改,只能赋值

        g) Lexical Cast 库:用于字符串、整数、浮点数的字面转换

        h) Meta State Machine库:用于表示UML2有限状态机的库

        i) Numeric Conversion 库:用于安全数字转换的一组函数

        j) Optional 库:使用容器的语义,包装了可能产生无效值的对象,实现了未初始化的概念

        k) Polygon 库:处理平面多边形的一些算法

        l) Program Options库:提供强大的命令行参数处理功能

        m) Scope Exit库:使用preprocessor库的预处理技术实现在退出作用域时资源自动释放

        n) Statechart库:提供有限自动状态机框架

        o) Swap库:为交换两个变量的值提供便捷方法

        p) System库:使用轻量级的对象封装操作系统底层的错误代码和错误信息,已被TR2接受

        q) Timer库:提供简易的度量时间和进度显示功能,可以用于性能测试等需要计时的任务

        r) Tribool库:三态布尔逻辑值,在true和false之外引入indeterminate不确定状态

        s) Typeof库:模拟C++0x新增加的typeof和auto关键字,以减轻变量类型声明的工作,简化代码

        t) Units库:实现了物理学的量纲处理

        u) Utility库:小工具集合

        v) Value Initialized库:用于保证变量在声明时被正确初始化

        w) Chrono库:实现了C++ 0x标准中N2661号建议 [2]  所支持的时间功能。

        x) Log库:实现日志功能。

        y) Predef库:提供一批统一兼容探测其他宏的预定义宏。 [5] 

20、编译器问题的变通方案库

        a) Compatibility库:为不符合标准库要求的环境提供帮助

        b) Config库:将程序的编译配置分解为三个部分:平台、编译器和标准库,帮助库开发者解决特定平台特定编译器的兼容问题

二、boost库安装及编译:

1、boost库的获取方式:

    可以从boost官网上下载,
    # 官方网站
        https://www.boost.org/

    # 下载地址
        https://www.boost.org/users/download/

    # 预编译版本下载地址
        https://sourceforge.net/projects/boost/files/boost-binaries/
    
    安装的时候先执行bootstrap的脚本文件(Windows执行.bat,Linux执行.sh),之后再执行b2的程序进行编译安装,注意参数可以指定。

2、boost 的目录结构说明

    在boost官网下载boost压缩文件(我用的是boost_1_74_0.zip这个版本),解压后主要目录结构说明如下:
    --boost_1_76_0\ : boost 根目录。
    
    --boost:最重要的目录 , 90 % 以上的 Boost 程序库源码都在这里。所有 boost 头文件。

    --doc:HTMI 格式的文档 , 也可以生成 PDF 格式的文档。
    
    --lib:预编译的二进制库文件。

    --libs:所有组件的示例、测试、编译代码和说明文档。

    --more:库作者的相关文档

    --status:可用于测试 Boost 库的各个组件。

    --tools:用于编译boost的 b2, quickbook 等自带工具的源代码等。

3、boost库的使用方式

    boost库的大多数组件不需要编译链接,我们在自己的源码里面直接包含头文件即可,如,如果使用boost::timer,只需要写以下的语句即可。
        #include <boost/timer.hpp>
        using namespace boost

    使用Boost库主要是附加其头文件目录和库文件目录,用什么工具都要遵循这个原则。

4、Linux boost库 开发环境搭建安装过程:

    下载下来之后解压到当前目录下。如:下载的包是:boost_1_63_0.tar.gz.

4.1、快捷安装

        这快捷安装boost的一个shell脚本,直接执行这个脚本加./b2 install即可。
        tar -zxvf boost_1_63_0.tar.gz       //解压下载的压缩包
        cd boost_1_63_0                     //进入目录
        vim bootstrap.sh                    //修改prefix为指定目录,笔者为/usr/local/boost1.79
        
        ./bootstrap.sh 
        sudo ./b2 install                   //不加sudo仍然生成在本目录

4.2、完全安装boost库

        执行下面命令即可

            ./bootstrap --buildtype=complete install
    
        这样可以安装所有的测试版,发行版,静态库和动态库。

4.3、定制安装

        用户可以根据自己的选择来编译需要使用的库

        下面这条命令是查看所有必须编译才能使用的库:
            
            ./b2 --show-libraries
    
        在完全编译的基础上,使用 --with 选项可打开,--without 选项关闭某个库的编译,如:
            ./b2 --with-date_time --buildtype=complete install      //将打开仅仅编译安装 date_time 库
            ./b2 --without-date_time --buildtype=complete install   //将关闭编译安装 date_time 库

4.4、验证开发环境

1、头文件<boost/version.hpp>里面有两个宏,定义了当前使用的boost程序的版本号。
            #define BOOST_VERSION 106300
            #define BOOST_LIB_VERSION "1_63"
2、头文件<boost/config.hpp>中有三个 BOOST_STDLIB,BOOST_PLATFORM 和 BOOST_COMPILER,分别定义了当前操作系统、编译器和标准库。
3、下面是测试boost是否安装成功的代码:
            #include <boost/version.hpp>
            #include <boost/config.hpp>
            int main()
             
            {
                 cout << BOOST_VERSION <<endl;
                 cout << BOOST_LIB_VERSION<<endl; 
                 cout << BOOST_STDLIB <<endl;
                 cout <<BOOST_PLATFORM <<endl;
                 cout << BOOST_COMPILER<<endl;
            }
            
            使用g++编译之后,能输出结果,那么,恭喜您,您的环境已经搭建好了。

5、Windows boost库 开发环境搭建安装过程:

1、使用windows的命令提示符用管理员的权限打开,切换到boost的根目录。

        bootstrap.bat   # 执行bootstrap.bat的批处理,
                        # 运行完成后会生成b2.exe程序
        
        b2.exe          # 开始编译工作

2、b2.exe程序可以支持的参数有:

        toolset 编译器类别,可以是gcc,或者是msvc

        target-os 目标操作系统,可以是Windows,Linux

        variant 生成类型,可以是 debug(-gd-)或者release (-)

        threadapi 线程API的实现,可以是win32或者pthread,在windows上编译就用win32

        link 链接库类型,可以是静态的static,也可以是shared,对应windows上的库就是.lib或者是dll

        runtime-link 动态还是静态链接C/C++运行时库。同样有shared (-)和static (-s-)两种方式,这样runtime-link和link可以产生4种组合方式,可以根据需要选择编译.

        prefix 安装路径

        user-config 用户自定义配置文件,在cross compile的时候可以用来配置编译工具链

        address-model 生成32位还是64位库文件

        architecture=x86 cpu架构,一般台式机位x86,嵌入式平台位arm
1、编译安装64位的Release版的静态链接库可以执行下面的指令:(-mt-s-):
            .\b2.exe variant=release threading=multi threadapi=win32 link=static runtime-link=static --prefix=E:\boost_1_77_0 address-model=64 architecture=x86 install -j8
2、当没有指定参数的时候,默认编译生成在当前目录下。
            从输出可以看出,头文件在D:\Software\boost_1_79_0,链接的库的路径在D:\Software\boost_1_79_9\stage\lib下,其中也会生成bin.v2的目录,大小在2.3G左右,可以直接删除。

3、Windows 编译静态库

        运行bootstrap.bat文件,会生成b2.exe及project-config.jam文件。执行b2.exe(我是Windows操作系统),会在boost_1_74_0\stage\lib下生成x64、x86平台的release及debug版本的静态库。(编译动态库需要添加参数:b2.exe link=shared)

4、下面是测试boost是否安装成功的代码:

        #include <iostream>
        #include "boost/version.hpp"
        int main()
        {
            std::cout << BOOST_LIB_VERSION << std::endl;
            std::cout << BOOST_VERSION << std::endl;
        }

5、构建工具b2:

     b2使用文本格式的构建脚本来管理代码,其名称通常是“jamfile”或“Jamfile”(类似make构建工具的makefile脚本一样)。此外b2还有一个特殊的“jamroot”文件,它需要放在整个项目的根目录下,用于管理项目树,定义整个项目的构建设置。

    jamroot文件一般用于定义整个项目里通用的编译参数、包含路径等设置,避免每个子目录里的jamfile重复定义。

    b2使用的构建语言称为bjam,它是一种解释型语言,拥有完整的语法定义,包括变量、分支、循环语句、函数,甚至还包括类。bjam是基于token的语言,它使用空格、tab等空白字符来区分语法元素,不仅是单词,即使是“:”“;”这样的标点符号前后也必须要有空格,否则bjam将无法识别标点,导致语法错误。

    实际上b2是bjam语言的解释器,它查找当前目录下的jamfile,并向上查找jamroot,解释执行其中的bjam语句,最终完成软件的构建。
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐