C++中Boost库裁剪与其应用详解
前言
Boost库涵盖的范围极广,有字符串和文本处理相关子库比如format库和regexp库,有容器相关子库比如variant库(和Qt的QVariant有得一拼),有迭代器子库比如tokenizer库(可以把字符进行tokenize),还有算法、函数对象和高阶编程相关子库如functional库、lambda库和signal库,还有泛型编程、模板编程子库如calltraits、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> intmain(void) { namespacept=boost::posix_time; pt::ptimenow=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()); return0; }
程序运行输出大概是:
date'+%Y-%m-%d%H:%M:%S'->2016-07-1119:33:19
这20行不到的代码,展示了Linux系统下一个常用指令date输出当前时间的效果(相当于命令行下输入date'+%Y-%m-%d%H:%M:%S')。
如果你的系统配置了Boost,那就到上面的链接下载源码,进入boost文件夹,这里一共有三个文件:一个main.cpp、一个CMakeLists.txt,一个README说明文档。
但要运行这个程序并不容易,尤其是在一切都要手工的Windows系统上:你必须自己去下载合适的boost版本,设定一些环境变量。
在Linux下则比较简单,只要三步(先下载源码,并cd到源码目录):
sudoapt-getinstall-ylibboost-all-devcmake mkdirbuild&&cdbuild cmake..&&make&&./BOOST
你不禁感慨,为了运行一个20行不到的小程序,居然要手工安装两三个G的boost库!
这时候boost库的裁剪,就显得尤为重要了。我们不希望拿到代码的人还要费时间去配置boost库,我们也不希望自己的代码要十分小心地,才能跑起来。我们要让自己的代码不论什么情况都能迅速地跑起来!
我们裁剪后的boost库,头文件大概有3.18MB,cpp文件有两个约11KB。看上去挺大,但是压缩完其实就213KB!拿到这份代码,首先解压include.zip到当前文件夹,然后运行cmake生成VS工程(或者Linux上的makefile工程),然后编译、运行。完全不需要再管那烦心的boost库的配置了!
我想你一定能把这个程序跑起来的。无论你用什么操作系统,用什么编译器。
运行起来更省心,这就是boost库裁剪的意义。
我要怎么裁剪出自己需要的部分?
我们来深究一下怎么拿到上面那3.18MB的头文件,11KB的cpp文件。
首先,下载Boost库源码,你可以去官网。我们只需要官方release的源码里的boost和libs文件夹下的东西,所以我建议你下载我的备份。因为它真的小很多,下载起来也很快。而且里面还打包了用于提取boost源码的工具bcp1。
然后,解压下载到的压缩包,进入源码文件夹,新建一个文件夹,比如叫output,然后在当前窗口打开命令行,输入./bcp.exeboost/date_time/posix_time/posix_time_types.hppoutput,这里"./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会尝试自动链接。所以我通常把这个文件内容清空。
总结
以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能有所帮助,如果有疑问大家可以留言交流。