铅笔

在你的害怕中坚持的越多,你就会越自信
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

boost为什么仅包含头文件就能用?

Posted on 2020-10-05 10:36  黑色の铅笔  阅读(1096)  评论(0编辑  收藏  举报

1.Boost简介

Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称。

既然是库那么使用的时候必然需要指定引用的头文件目录、库文件目录、和具体的库文件。对应到VS项目中:

  •  附加包含目录---添加工程的头文件目录
  •  附加库目录---添加文件引用的lib静态库路径
  •  附加依赖项---添加工程引用的lib文件名

2.Boost库的使用配置

c++ boost大多数组件都是仅包含头文件就能使用的,只有少部分需要单独编译。

具体表现为:包含目录中添加了boost的目录,增加链接目录并没有指定具体的库文件。运行时竟然都不会报找不到对应的库文件错误。

?????大写的问号

 

原来boost的组件有两种,一种是完全在.hpp中实现的,于是只要包含头文件即可。

但是还有很多组件是需要链接库文件的,这时候boost就使用了一种叫做自动链接的技术。

 

首先,在boost在编译过程中,会根据编译选项按照一定的规则命名库文件。

然后,利用宏来组装预处理命令,就能链接到指定的库文件了。

 

举个具体例子libboost_atomic-vc110-mt-s-x32-1_72.lib  

vc110:VS2012 

mt:多线程

x32:32位编译器编译出来的动态库  1_72表示version

然后在boost/atomic/detail/link.hpp中,可以看到这样两行:

#define BOOST_LIB_NAME boost_atomic
#include <boost/config/auto_link.hpp>

在auto_link.hpp中,又可以看到:

#ifdef BOOST_AUTO_LINK_TAGGED
#pragma comment(lib, BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT ".lib")

这个预处理命令用来链接指定的库文件,这个展开来就是:

#pragma comment(lib, libboost_atomic-vc110-mt-s-x32-1_72.lib)

其他细节就不说了,总之只要在vs的设置中包含编译好的lib目录,就能自动链接到对应的库文件了。

 

 

参考:https://blog.csdn.net/u012043391/article/details/54972127

https://www.zhihu.com/question/275966715