热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

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

大家都知道STL全称"标准模板库(StandardTemplateLibrary)",其实它是一套标准,可能有不同的实现,它是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 
#include 

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 会尝试自动链接。所以我通常把这个文件内容清空。

总结

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


推荐阅读
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 近年来,大数据成为互联网世界的新宠儿,被列入阿里巴巴、谷歌等公司的战略规划中,也在政府报告中频繁提及。据《大数据人才报告》显示,目前全国大数据人才仅46万,未来3-5年将出现高达150万的人才缺口。根据领英报告,数据剖析人才供应指数最低,且跳槽速度最快。中国商业结合会数据剖析专业委员会统计显示,未来中国基础性数据剖析人才缺口将高达1400万。目前BAT企业中,60%以上的招聘职位都是针对大数据人才的。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
author-avatar
蒣彬彬
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有