searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Boost C++ 库编译、裁剪和使用

2024-08-21 09:43:09
67
0

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());
}
0条评论
作者已关闭评论
sky
4文章数
0粉丝数
sky
4 文章 | 0 粉丝
原创

Boost C++ 库编译、裁剪和使用

2024-08-21 09:43:09
67
0

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());
}
文章来自个人专栏
流直存
3 文章 | 1 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0