1 编译
安装boost的时候,可以直接去boost的官网下载。
以boost_1_81_0.tar.gz为例,Boost的源码结构如下:
$ tree -L 1 boost_1_81_0
boost_1_81_0
├── boost // 所有boost头文件目录
├── boost-build.jam
├── boostcpp.jam
├── boost.css
├── boost.png
├── bootstrap.bat
├── bootstrap.sh
├── doc
├── index.htm
├── index.html
├── INSTALL
├── Jamroot
├── libs // 源文件,测试代码,示例程序和文档目录
├── LICENSE_1_0.txt
├── more
├── README.md
├── rst.css
├── status
└── tools // 自带工具,如b2,bcp等
编译步骤如下:
(1)./bootstrap.sh --prefix=<path/to/installation/prefix>
执行 ./bootstrap.sh --prefix=/opt/boost181 指定安装路径为/opt/boost181
(2)./b2 headers (可选)
如果只使用Boost的header-only的组件,只要执行步骤(2)即可,然后boost目录就包含了所有组件的头文件。可以将boost目录复制到其他地方直接使用。
(3)./b2 link=static runtime-link=static install
只编译安装静态库
Boost库中大部分组件都是header-only的,不需要编译,只需要include头文件就可以直接使用。
可以使用./b2 --show-libraries命令查看所有必须编译才能使用的库。
$ ./b2 --show-libraries
The following libraries require building:
- atomic
- chrono
- container
- context
- contract
- coroutine
- date_time
- exception
- fiber
- filesystem
- graph
- graph_parallel
- headers
- iostreams
- json
- locale
- log
- math
- mpi
- nowide
- program_options
- python
- random
- regex
- serialization
- stacktrace
- system
- test
- thread
- timer
- type_erasure
- url
- wave
2 裁剪
整个Boost的代码量是非常庞大的,以boost_1_81_0为例,不考虑源文件,仅头文件就有超过210万行的代码量。如果将这些头文件都包含到工程里面一些IDE只索引这些头文件就要消耗大量资源。
$ cloc /opt/boost181/include/boost/
15447 text files.
15148 unique files.
659 files ignored.
github.com/AlDanial/cloc v 1.70 T=26.91 s (549.6 files/s, 112554.8 lines/s)
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
C/C++ Header 14788 408993 456020 2163750
-------------------------------------------------------------------------------
SUM: 14788 408993 456020 2163750
-------------------------------------------------------------------------------
实际项目开发过程中,往往不会使用全部的Boost组件,尤其是C++11以后,往往会从Boost中精挑细选一些组件使用。可以使用Boost自带的bcp工具来裁剪抽取实际项目中使用到的部分Boost子集。
接下来以Boost循环缓冲区circular_buffer为例,介绍如何使用bcp工具抽取circular_buffer子集。
# 首先生成bcp工具,生成的bcp工具在dist/bin目录下
./b2 tools/bcp
# 抽取circular_buffer子集并安装到/opt/boost181-sub
dist/bin/bcp boost/circular_buffer /opt/boost181-sub
继续使用cloc工具统计一下代码量,可以看到抽取的circular_buffer子集加上一些必须的依赖有4.5万行左右的代码,虽然也不少,但是比起210万行代码还是少多了。
$ cloc boost181-sub/
291 text files.
291 unique files.
0 files ignored.
github.com/AlDanial/cloc v 1.70 T=0.50 s (584.6 files/s, 121398.1 lines/s)
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
C/C++ Header 291 5166 9540 45725
-------------------------------------------------------------------------------
SUM: 291 5166 9540 45725
-------------------------------------------------------------------------------
3 使用
circular_buffer是一个header-only的Boost组件,只需要include boost/circular_buffer.hpp就可以直接使用。
#include "boost/circular_buffer.hpp"
TEST(CircularBufferTest, Simple) {
boost::circular_buffer<int> buffer(3);
ASSERT_EQ(3U, buffer.capacity());
for (int i = 0; i < buffer.capacity(); ++i) {
buffer.push_back(i);
}
ASSERT_EQ(3U, buffer.size());
ASSERT_EQ(0, buffer.front());
// 当前缓冲中数据 0 1 2
// 空间已满,元素0被覆盖成3
buffer.push_back(3);
ASSERT_EQ(3, buffer.back());
// 当前缓冲中数据 1 2 3
for (int i = 1; i <= buffer.capacity(); ++i) {
int elem = buffer.front();
ASSERT_EQ(elem, i);
buffer.pop_front();
}
ASSERT_EQ(0U, buffer.size());
}