0


C++_开发_Boost开源库_介绍_使用

文章目录

一、Boost库简介

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

  1. 质:C++程序库
  2. 开发者:Boost社区
  3. 的:为C++程序员提供免费的程序库
  4. 能:为C++语言标准库提供扩展
  5. 义:是为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头文件当中 ,定义实现都包含在同一文件。

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

7、分类

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

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

  1. 字符串和文本处理库
  2. 容器库
  3. 迭代器库
  4. 算法库
  5. 函数对象和高阶编程库
  6. 泛型编程
  7. 模板元编程
  8. 预处理元编程
  9. 并发编程
  10. 数学和数字
  11. 排错和测试
  12. 数据结构
  13. 图像处理
  14. 输入输出
  15. 跨语言混合编程
  16. 内存管理
  17. 解析
  18. 编程接口
  19. 杂项
  20. 编译器问题的变通方案

1、字符串和文本处理库

  1. a) Conversion库:对C++类型转换的增强,提供更强的类型安全转换、更高效的类型安全保护、进行范围检查的数值转换和词法转换。
  2. b) Format库:实现类似printf的格式化对象,可以把参数格式化到一个字符串,而且是完全类型安全的。
  3. c) IOStream :扩展C++标准库流处理,建立一个流处理框架。
  4. d) Lexical Cast库:用于字符串、整数、浮点数的字面转换。
  5. e) Regex 库:正则表达式,已经被TR1所接受。
  6. f) Spirit库:基于EBNF范式的LL解析器框架
  7. g) String Algo库:一组与字符串相关的算法
  8. h) Tokenizer库:把字符串拆成一组记号的方法
  9. i) Wave库:使用spirit库开发的一个完全符合C/C++标准的预处理器
  10. j) Xpressive 库:无需编译即可使用的正则表达式库

2、容器库

  1. a) Array 库:对C语言风格的数组进行包装
  2. b) Bimap 库:双向映射结构库
  3. c) Circular Buffer 库:实现循环缓冲区的数据结构
  4. d) Disjoint Sets :实现不相交集的库
  5. e) Dynamic Bitset 库:支持运行时调整容器大小的位集合
  6. f) GIL 库:通用图像库
  7. g) Graph 库:处理图结构的库
  8. h) ICL 库:区间容器库,处理区间集合和映射
  9. i) Intrusive 库:侵入式容器和算法
  10. j) Multi-Array 库:多维容器
  11. k) Multi-Index 库:实现具有多个STL兼容索引的容器
  12. l) Pointer Container 库:容纳指针的容器
  13. m) Property Map 库:提供键/值映射的属性概念定义
  14. n) Property Tree 库:保存了多个属性值的树形数据结构
  15. o) Unordered 库:散列容器,相当于hash_xxx
  16. p) Variant 库:简单地说,就是持有string, vector等复杂类型的联合体

3、迭代器库

  1. a) GIL 库:通用图像库
  2. b) Graph 库:处理图结构的库
  3. c) Iterators 库:为创建新的迭代器提供框架
  4. d) Operators 库:允许用户在自己的类里仅定义少量的操作符,就可方便地自动生成其他操作符重载,而且保证正确的语义实现
  5. e) Tokenizer 库:把字符串拆成一组记号的方法

4、算法库

  1. a) Foreach库:容器遍历算法
  2. b) GIL库:通用图像库
  3. c) Graph库:处理图结构的库
  4. d) Min-Max库:可在同一次操作中同时得到最大值和最小值
  5. e) Range库:一组关于范围的概念和实用程序
  6. f) String Algo库:可在不使用正则表达式的情况下处理大多数字符串相关算法操作
  7. g) Utility库:小工具的集合

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

  1. a) Bind库:绑定器的泛化,已被收入TR1
  2. b) Function库:实现一个通用的回调机制,已被收入TR1
  3. c) Functional库:适配器的增强版本
  4. d) Functional/Factory库:用于实现静态和动态的工厂模式
  5. e) Functional/Forward库:用于接受任何类型的参数
  6. f) Functional/Hash库:实现了TR1中的散列函数
  7. g) Lambda库:Lambda表达式,即未命名函数
  8. h) Member Function库:是STLmem_funmem_fun_ref的扩展
  9. i) Ref库:包装了对一个对象的引用,已被收入TR1
  10. j) Result Of库:用于确定一个调用表达式的返回类型,已被收入TR1
  11. k) Signals库:实现线程安全的观察者模式
  12. l) Signals2库:基于Signal的另一种实现
  13. m) Utility库:小工具的集合
  14. n) Phoenix库:实现在C++中的函数式编程。

6、泛型编程库

  1. a) Call Traits库:封装可能是最好的函数传参方式
  2. b) Concept Check库:用来检查是否符合某个概念
  3. c) Enable If库:允许模板函数或模板类在偏特化时仅针对某些特定类型有效
  4. d) Function Types库:提供对函数、函数指针、函数引用和成员指针等类型进行分类分解和合成的功能
  5. e) GIL库:通用图像库
  6. f) In Place Factory, Typed In Place Factory库:工厂模式的一种实现
  7. g) Operators库:允许用户在自己的类里仅定义少量的操作符,就可方便地自动生成其他操作符重载,而且保证正确的语义实现
  8. h) Property Map库:提供键值映射的属性概念定义
  9. i) Static Assert库:把断言的诊断时刻由运行期提前到编译期,让编译器检查可能发生的错误
  10. j) Type Traits库:在编译时确定类型是否具有某些特征
  11. k) TTI库:实现类型萃取的反射功能。

7、模板元编程

  1. a) Fusion库:提供基于tuple的编译期容器和算法
  2. b) MPL库:模板元编程框架
  3. c) Proto库:构建专用领域嵌入式语言
  4. d) Static Assert库:把断言的诊断时刻由运行期提前到编译期,让编译器检查可能发生的错误
  5. e) Type Traits库:在编译时确定类型是否具有某些特征

8、预处理元编程库

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

9、并发编程库

  1. a) Asio库:基于操作系统提供的异步机制,采用前摄设计模式实现了可移植的异步IO操作
  2. b) Interprocess库:实现了可移植的进程间通信功能,包括共享内存、内存映射文件、信号量、文件锁、消息队列等
  3. c) MPI库:用于高性能的分布式并行开发
  4. d) Thread库:为C++增加线程处理能力,支持WindowsPOSIX线程
  5. e) Context库:提供了在单个线程上的协同式多任务处理的支持。该库可以用于实现用户级的多任务处理的机制,比如说协程coroutines,用户级协作线程或者类似于C#语言中yield关键字的实现。

[1]

  1. f) Atomic库:实现C++11样式的atomic<>,提供原子数据类型的支持和对这些原子类型的原子操作的支持。
  2. g)Coroutine库:实现对协程的支持。协程与线程的不同之处在于,协程是基于合作式多任务的,而多线程是基于抢先式多任务的。
  3. h)Lockfree库:提供对无锁数据结构的支持。

10、数学和数字库

  1. a) Accumulators库:用于增量计算的累加器的框架
  2. b) Integer库:提供一组有关整数处理的类
  3. c) Interval库:处理区间概念的数学问题
  4. d) Math库:数学领域的模板类和算法
  5. e) Math Common Factor库:用于支持最大公约数和最小公倍数
  6. f) Math Octonion :用于支持八元数
  7. g) Math Quaternion库:用于支持四元数
  8. h) Math/Special Functions库:数学上一些常用的函数
  9. i) Math/Statistical Distributions库:用于单变量统计分布操作
  10. j) Multi-Array库:多维容器
  11. k) Numeric Conversion库:用于安全数字转换的一组函数
  12. l) Operators库:允许用户在自己的类里仅定义少量的操作符,就可方便地自动生成其他操作符重载,而且保证正确的语义实现
  13. m) Random库:专注于伪随机数的实现,有多种算法可以产生高质量的伪随机数
  14. n) Rational库:实现了没有精度损失的有理数
  15. o) uBLAS库:用于线性代数领域的数学库
  16. p) Geometry库:用于解决几何问题的概念、原语和算法。
  17. q) Ratio库:根据C++ 0x标准N2661号建议 [2] ,实现编译期的分数操作。
  18. r)Multiprecision库:提供比C++内置的整数、分数和浮点数精度更高的多精度数值运算功能。 [3]
  19. s)Odeint库:用于求解常微分方程的初值问题。 [4]

11、排错和测试库

  1. a) Concept Check :用来检查是否符合某个概念
  2. b) Static Assert :把断言的诊断时刻由运行期提前到编译期,让编译器检查可能发生的错误
  3. c) Test库:提供了一个用于单元测试的基于命令行界面的测试套件

12、数据结构库

  1. a) Any库:支持对任意类型的值进行类型安全的存取
  2. b) Bimap库:双向映射结构库
  3. c) Compressed Pair库:优化的对pair对象的存储
  4. d) Fusion库:提供基于tuple的编译期容器和算法
  5. e) ICL库:区间容器库,处理区间集合和映射
  6. f) Multi-Index库:为底层的容器提供多个索引
  7. g) Pointer Container库:容纳指针的容器
  8. h) Property Tree库:保存了多个属性值的树形数据结构
  9. i) Tuple库:元组,已被TR1接受
  10. j) Uuid库:用于表示和生成UUID
  11. k) Variant库:有类别的泛型联合类
  12. l) Heap库:对std::priority_queue扩展,实现优先级队列。
  13. m) Type Erasure: 实现运行时的多态。

13、图像处理库

  1. a) GIL库:通用图像库

14、输入输出库

  1. a) Assign库:用简洁的语法实现对STL容器赋值或者初始化
  2. b) Format库:实现类似printf的格式化对象,可以把参数格式化到一个字符串,而且是完全类型安全的
  3. c) IO State Savers库:用来保存流的当前状态,自动恢复流的状态等
  4. d) IOStreams库:扩展C++标准库流处理,建立一个流处理框架
  5. e) Program Options库:提供强大的命令行参数处理功能
  6. f) Serialization库:实现C++数据结构的持久化

15、跨语言混合编程库

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

16、内存管理库

  1. a) Pool库:基于简单分隔存储思想实现了一个快速、紧凑的内存池库
  2. b) Smart Ptr库:智能指针
  3. c) Utility库:小工具的集合

17、解析库

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

18、编程接口库

  1. a) Function库:实现一个通用的回调机制,已被收入TR1
  2. b) Parameter库:提供使用参数名来指定函数参数的机制

19、综合类杂项库

  1. a) Compressed Pair库:优化的对pair对象的存储
  2. b) CRC库:实现了循环冗余校验码功能
  3. c) Date Time 库:一个非常全面灵活的日期时间库
  4. d) Exception库:针对标准库中异常类的缺陷进行强化,提供<<操作符重载,可以向异常传入任意数据
  5. e) Filesystem库:可移植的文件系统操作库,可以跨平台操作目录、文件,已被TR2接受
  6. f) Flyweight 库:实现享元模式,享元对象不可修改,只能赋值
  7. g) Lexical Cast 库:用于字符串、整数、浮点数的字面转换
  8. h) Meta State Machine库:用于表示UML2有限状态机的库
  9. i) Numeric Conversion 库:用于安全数字转换的一组函数
  10. j) Optional 库:使用容器的语义,包装了可能产生无效值的对象,实现了未初始化的概念
  11. k) Polygon 库:处理平面多边形的一些算法
  12. l) Program Options库:提供强大的命令行参数处理功能
  13. m) Scope Exit库:使用preprocessor库的预处理技术实现在退出作用域时资源自动释放
  14. n) Statechart库:提供有限自动状态机框架
  15. o) Swap库:为交换两个变量的值提供便捷方法
  16. p) System库:使用轻量级的对象封装操作系统底层的错误代码和错误信息,已被TR2接受
  17. q) Timer库:提供简易的度量时间和进度显示功能,可以用于性能测试等需要计时的任务
  18. r) Tribool库:三态布尔逻辑值,在truefalse之外引入indeterminate不确定状态
  19. s) Typeof库:模拟C++0x新增加的typeofauto关键字,以减轻变量类型声明的工作,简化代码
  20. t) Units库:实现了物理学的量纲处理
  21. u) Utility库:小工具集合
  22. v) Value Initialized库:用于保证变量在声明时被正确初始化
  23. w) Chrono库:实现了C++ 0x标准中N2661号建议 [2] 所支持的时间功能。
  24. x) Log库:实现日志功能。
  25. y) Predef库:提供一批统一兼容探测其他宏的预定义宏。 [5]

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

  1. a) Compatibility库:为不符合标准库要求的环境提供帮助
  2. b) Config库:将程序的编译配置分解为三个部分:平台、编译器和标准库,帮助库开发者解决特定平台特定编译器的兼容问题

二、boost库安装及编译:

1、boost库的获取方式:

  1. 可以从boost官网上下载,
  2. # 官方网站
  3. https://www.boost.org/
  4. # 下载地址
  5. https://www.boost.org/users/download/
  6. # 预编译版本下载地址
  7. https://sourceforge.net/projects/boost/files/boost-binaries/
  8. 安装的时候先执行bootstrap的脚本文件(Windows执行.batLinux执行.sh),之后再执行b2的程序进行编译安装,注意参数可以指定。

2、boost 的目录结构说明

  1. boost官网下载boost压缩文件(我用的是boost_1_74_0.zip这个版本),解压后主要目录结构说明如下:
  2. --boost_1_76_0\ boost 根目录。
  3. --boost:最重要的目录 , 90 % 以上的 Boost 程序库源码都在这里。所有 boost 头文件。
  4. --docHTMI 格式的文档 , 也可以生成 PDF 格式的文档。
  5. --lib:预编译的二进制库文件。
  6. --libs:所有组件的示例、测试、编译代码和说明文档。
  7. --more:库作者的相关文档
  8. --status:可用于测试 Boost 库的各个组件。
  9. --tools:用于编译boost b2, quickbook 等自带工具的源代码等。

3、boost库的使用方式

  1. boost库的大多数组件不需要编译链接,我们在自己的源码里面直接包含头文件即可,如,如果使用boost::timer,只需要写以下的语句即可。
  2. #include <boost/timer.hpp>
  3. using namespace boost
  4. 使用Boost库主要是附加其头文件目录和库文件目录,用什么工具都要遵循这个原则。

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

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

4.1、快捷安装

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

4.2、完全安装boost库

  1. 执行下面命令即可
  2. ./bootstrap --buildtype=complete install
  3. 这样可以安装所有的测试版,发行版,静态库和动态库。

4.3、定制安装

  1. 用户可以根据自己的选择来编译需要使用的库
  2. 下面这条命令是查看所有必须编译才能使用的库:
  3. ./b2 --show-libraries
  4. 在完全编译的基础上,使用 --with 选项可打开,--without 选项关闭某个库的编译,如:
  5. ./b2 --with-date_time --buildtype=complete install //将打开仅仅编译安装 date_time 库
  6. ./b2 --without-date_time --buildtype=complete install //将关闭编译安装 date_time 库

4.4、验证开发环境

1、头文件<boost/version.hpp>里面有两个宏,定义了当前使用的boost程序的版本号。

  1. #define BOOST_VERSION 106300
  2. #define BOOST_LIB_VERSION "1_63"

2、头文件<boost/config.hpp>中有三个 BOOST_STDLIB,BOOST_PLATFORM 和 BOOST_COMPILER,分别定义了当前操作系统、编译器和标准库。

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

  1. #include <boost/version.hpp>
  2. #include <boost/config.hpp>
  3. int main()
  4. {
  5. cout << BOOST_VERSION <<endl
  6. cout << BOOST_LIB_VERSION<<endl;
  7. cout << BOOST_STDLIB <<endl;
  8. cout <<BOOST_PLATFORM <<endl;
  9. cout << BOOST_COMPILER<<endl;
  10. }
  11. 使用g++编译之后,能输出结果,那么,恭喜您,您的环境已经搭建好了。

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

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

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

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

  1. toolset 编译器类别,可以是gcc,或者是msvc
  2. target-os 目标操作系统,可以是Windows,Linux
  3. variant 生成类型,可以是 debug(-gd-)或者release (-)
  4. threadapi 线程API的实现,可以是win32或者pthread,在windows上编译就用win32
  5. link 链接库类型,可以是静态的static,也可以是shared,对应windows上的库就是.lib或者是dll
  6. runtime-link 动态还是静态链接C/C++运行时库。同样有shared (-)和static (-s-)两种方式,这样runtime-linklink可以产生4种组合方式,可以根据需要选择编译.
  7. prefix 安装路径
  8. user-config 用户自定义配置文件,在cross compile的时候可以用来配置编译工具链
  9. address-model 生成32位还是64位库文件
  10. architecture=x86 cpu架构,一般台式机位x86,嵌入式平台位arm

1、编译安装64位的Release版的静态链接库可以执行下面的指令:(-mt-s-):

  1. .\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、当没有指定参数的时候,默认编译生成在当前目录下。

  1. 从输出可以看出,头文件在D:\Software\boost_1_79_0,链接的库的路径在D:\Software\boost_1_79_9\stage\lib下,其中也会生成bin.v2的目录,大小在2.3G左右,可以直接删除。

3、Windows 编译静态库

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

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

  1. #include <iostream>
  2. #include "boost/version.hpp"
  3. int main()
  4. {
  5. std::cout << BOOST_LIB_VERSION << std::endl;
  6. std::cout << BOOST_VERSION << std::endl;
  7. }

5、构建工具b2:

  1. b2使用文本格式的构建脚本来管理代码,其名称通常是“jamfile”或“Jamfile”(类似make构建工具的makefile脚本一样)。此外b2还有一个特殊的“jamroot”文件,它需要放在整个项目的根目录下,用于管理项目树,定义整个项目的构建设置。
  2. jamroot文件一般用于定义整个项目里通用的编译参数、包含路径等设置,避免每个子目录里的jamfile重复定义。
  3. b2使用的构建语言称为bjam,它是一种解释型语言,拥有完整的语法定义,包括变量、分支、循环语句、函数,甚至还包括类。bjam是基于token的语言,它使用空格、tab等空白字符来区分语法元素,不仅是单词,即使是“:”“;”这样的标点符号前后也必须要有空格,否则bjam将无法识别标点,导致语法错误。
  4. 实际上b2bjam语言的解释器,它查找当前目录下的jamfile,并向上查找jamroot,解释执行其中的bjam语句,最终完成软件的构建。
标签: c++ 开源 unix

本文转载自: https://blog.csdn.net/qq_44681788/article/details/130895520
版权归原作者 123无敌,就你了 所有, 如有侵权,请联系我们删除。

“C++_开发_Boost开源库_介绍_使用”的评论:

还没有评论