C++中Boost库裁剪与其应用详解

 更新时间:2016年10月27日 10:01:38   投稿:daisy  
大家都知道STL全称"标准模板库(Standard Template Library)",其实它是一套标准,可能有不同的实现,它是 C++ 的"标准库"。Boost 则是一个 C++ 库,被称为"C++ 准标准库"。那么这篇文章文章我们就来详细的介绍C++Boost库的裁剪与其应用,感兴趣的朋友可以一起学习。

前言

Boost 库涵盖的范围极广,有字符串和文本处理相关子库比如 format 库和 regexp 库,有容器相关子库比如 variant 库(和 Qt 的 QVariant 有得一拼),有迭代器子库比如 tokenizer 库(可以把字符进行 tokenize),还有算法、函数对象和高阶编程相关子库如functional 库、lambda 库和 signal 库,还有泛型编程、模板编程子库如 call traits、mpl,还有并发编程相关的 thread 库,等等等等。

Boost 是如此强大,毫无疑问它也很大。Windows 上安装 boost 需要占用 2G+ 的空间,编译配置起来也十分麻烦。

本文讨论的是如何不配置 boost 库而使用 boost 库。

解决方案用一句话说就是:

裁剪 boost 库,并在项目中内嵌 boost 源码,使项目脱离对 boost 库的依赖。

通过一个例子说明 boost 库裁剪的意义

或许你还是不明白 boost 库裁剪到底是啥意思,那我们一起来跑一个例子。以我的 cmake-templates 里面的一个 boost 代码为例,源码只有一个 main.cpp,里面只有如下几行:

#include <cstdio>
#include <boost/date_time/posix_time/posix_time_types.hpp>

int main( void )
{
 namespace pt = boost::posix_time;
 pt::ptime now = pt::second_clock::local_time();

 printf( "%s\t->\t%04d-%02d-%02d %02d:%02d:%02d\n"
   , "date '+%Y-%m-%d %H:%M:%S'"
   , (int)now.date().year()
   , (int)now.date().month()
   , (int)now.date().day()
   , (int)now.time_of_day().hours()
   , (int)now.time_of_day().minutes()
   , (int)now.time_of_day().seconds() );

 return 0;
}

程序运行输出大概是:

date '+%Y-%m-%d %H:%M:%S' -> 2016-07-11 19:33:19

这 20 行不到的代码,展示了 Linux 系统下一个常用指令 date 输出当前时间的效果(相当于命令行下输入 date '+%Y-%m-%d %H:%M:%S')。

如果你的系统配置了 Boost,那就到上面的链接下载源码,进入 boost 文件夹,这里一共有三个文件:一个 main.cpp、一个 CMakeLists.txt,一个 README 说明文档。

但要运行这个程序并不容易,尤其是在一切都要手工的 Windows 系统上:你必须自己去下载合适的 boost 版本,设定一些环境变量。

在 Linux 下则比较简单,只要三步(先下载源码,并 cd 到源码目录):

sudo apt-get install -y libboost-all-dev cmake
mkdir build && cd build
cmake .. && make && ./BOOST

你不禁感慨,为了运行一个 20 行不到的小程序,居然要手工安装两三个 G 的 boost 库!

这时候 boost 库的裁剪,就显得尤为重要了。我们不希望拿到代码的人还要费时间去配置 boost 库,我们也不希望自己的代码要十分小心地,才能跑起来。我们要让自己的代码不论什么情况都能迅速地跑起来!

我们裁剪后的 boost 库,头文件大概有 3.18 MB,cpp 文件有两个约 11 KB。看上去挺大,但是压缩完其实就 213 KB!拿到这份代码,首先解压 include.zip 到当前文件夹,然后运行 cmake 生成 VS 工程(或者 Linux 上的 makefile 工程),然后编译、运行。完全不需要再管那烦心的 boost 库的配置了!

我想你一定能把这个程序跑起来的。无论你用什么操作系统,用什么编译器。

运行起来更省心,这就是 boost 库裁剪的意义。

我要怎么裁剪出自己需要的部分?

我们来深究一下怎么拿到上面那 3.18 MB 的头文件,11 KB 的 cpp 文件。

首先,下载 Boost 库源码,你可以去 官网。我们只需要官方 release 的源码里的 boost 和 libs 文件夹下的东西,所以我建议你下载我的备份。因为它真的小很多,下载起来也很快。而且里面还打包了用于提取 boost 源码的工具 bcp1。

然后,解压下载到的压缩包,进入源码文件夹,新建一个文件夹,比如叫 output,然后在当前窗口打开命令行,输入 ./bcp.exe boost/date_time/posix_time/posix_time_types.hpp output,这里 "./bcp.exe" 是我们的裁剪工具,"boost/date_time/posix_time/posix_time_types.hpp" 是我们自己项目中用到的 boost 头文件,如果有多个头文件,用空格隔开,把它们都敲进命令行。2最后的 "output" 是输出文件夹。

在 cmake 里,这个过程大概是

1)在源码根目录新建 include 文件夹,在根目录的 CMakeLists.txt 加上 include_directories( ${CMAKE_SOURCE_DIR} );

2)新建 libs 文件夹,把裁剪出来的 cpp 文件放到这个文件下的 MiniBoost 文件加下,然后参考 district10/bcp-example-1/libs 写好 CMakeLists 文件,再到根目录的 CMakeLists 文件加上 add_subdirectory( libs);3)将裁剪出来的 miniboost 链接到我们的二进制:target_link_libraries( ${PROJECT_NAME} MiniBoost )

你可以仔细对比看看链接系统安装的 Boost 库和使用自带的裁剪后的 Boost 库(我把它称为 MiniBoost)两者的区别和联系

注意:一个需要注意的地方是,提取出来的头文件里,boost/config/auto_link.hpp 里的内容最好删掉,不然在 Windows 平台上,boost 会尝试自动链接。所以我通常把这个文件内容清空。

总结

以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能有所帮助,如果有疑问大家可以留言交流。

相关文章

  • C语言编程中实现二分查找的简单入门实例

    C语言编程中实现二分查找的简单入门实例

    这篇文章主要介绍了C语言编程中实现二分查找的简单入门实例,需要的朋友可以参考下
    2015-12-12
  • Qt实现SqlTableModel映射组件应用小结

    Qt实现SqlTableModel映射组件应用小结

    在Qt中提供了QSqlTableModel模型类,它为开发者提供了一种直观的方式来与数据库表格进行交互,本文就来介绍一下Qt实现SqlTableModel映射组件应用小结,感兴趣的可以了解一下
    2023-12-12
  • C语言指针入门学习面面观

    C语言指针入门学习面面观

    这篇文章主要介绍了C语言指针的一些基础知识,指针可以说是C语言入门学习中的头等大事,文中从数组和函数等多方面剖析C中指针的作用,需要的朋友可以参考下
    2016-02-02
  • C++编程异常处理中try和throw以及catch语句的用法

    C++编程异常处理中try和throw以及catch语句的用法

    这篇文章主要介绍了C++编程异常处理中try和throw以及catch语句的用法,包括对Catch块的计算方式的介绍,需要的朋友可以参考下
    2016-01-01
  • C++实现图像压缩的示例代码

    C++实现图像压缩的示例代码

    这篇文章主要为大家详细介绍了如何使用C++实现图像压缩的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • C++算法学习之回溯法的应用

    C++算法学习之回溯法的应用

    这篇文章介绍了C++算法中回溯法的一些应用,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C++容器适配器的概念与示例

    C++容器适配器的概念与示例

    C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈,今天我们来探究一下stl容器适配器的使用吧
    2023-01-01
  • C语言中的const和free用法详解

    C语言中的const和free用法详解

    C语言中的const和C++中的const是有区别的,而且在使用VS编译测试的时候,如果是C的话,请一定要建立一个后缀为C的文件,不要是CPP的文件。因为,两个编译器会有差别的。下面通过本文给大家分享C语言中的const和free用法,感兴趣的朋友一起看看吧
    2017-04-04
  • C++性能剖析教程之switch语句

    C++性能剖析教程之switch语句

    除了用嵌套if语句外,C++中还提供switch语句,又称为“开关语句”,用来实现多分支(多选一),下面这篇文章主要给大家介绍了关于C++性能剖析教程之switch语句的相关资料,需要的朋友可以参考下
    2018-06-06
  • C++实现大数乘法算法代码

    C++实现大数乘法算法代码

    这篇文章主要介绍了C++实现大数乘法算法代码的相关资料,需要的朋友可以参考下
    2015-03-03

最新评论