boost入门(一):boost简介
前言
发现自己做为C++,竟然没有用过boost。特地学习下如何使用boost,我作为初学者,会从入门指南开始,一点点深入了解boost。
本文采用的版本是boost 1.75.0
boost 介绍
boost 是一个跨平台的C++工具库,是的,没错!相当于一个大的工具集合。当然boost没有那么全面,比如界面库就没有。
首先到官网下载boost,我选择的是boost 1.75.0 Windows版本。可以阅读发行版本的文档,来查看boost包含有哪些工具,我就不一一列出来,可以去boost 1.75.0 documentation看下。
boost 直接引入hpp
boost是多个库的集合,有些库采用hpp头文件编写。我们如果要用这种库,直接引用头文件即可。
首先设置项目直接引入boost的头文件:
接下来就能使用使用boost的头文件了。以下是引用Boost.Lambda模块:
1 |
|
这个代码的功能是把输入的数字*3,然后再输出。
具体代码我们不用看,只要看到运行结果,说明我们成功调用了boost库中的Lambda模块。是不是很简单?
boost 构建
boost中有些库需要构建,那么就需要借助b2.exe程序了。我们可以把b2.exe理解成预编译器,它会告诉真正的编译器如何进行编译。
b2.exe 默认在目录下是没有的,需要运行tools\build 目录下的bootstrap.bat :
从图可以看出,运行bootstrap.bat,会编译出b2.exe
有了b2.exe,我们下一步就是安装了。安装格式为 b2 install –prefix = PREFIX ,其中PREFIX为要安装Boost.Build的目录。比如我要安装在F:\C++\boost_1_75_0\build,那么命令行:
1 | b2 install --prefix=F:\C++\boost_1_75_0\build |
最后一步,可选。将F:\C++\boost_1_75_0\build\bin添加到环境变量中,以便命令行在哪个目录都可以用b2
下面开始重头戏,编译boost。F:\C++\boost_1_75_0\builds代表编译过程中的中间文件。
在命令行中输入:
1 | b2 --build-dir=F:\C++\boost_1_75_0\builds toolset=msvc --build-type=complete stage |
编译过程有点慢,请耐心等待!编译的结果在F:\C++\boost_1_75_0\stage\lib目录下
编译完之后,我们在项目上添加附加库目录:
编译完之后,我们演示下与Boost二进制库的链接:
1 |
|
PS:因为VS编译器可以自动链接到库,所以我们不需要手动添加依赖库
boost 构建的命名规则
我们可以找一个库 libboost_regex-vc142-mt-gd-x32-1_75.lib 进行分解:
lib
前缀:除Windows外,每个boost库名称都以该字符串开头。在Windows上,只有静态库才会以lib开头
boost_regex
库名称:所有boost库文件名都以 boost_ 开头
-vc142
平台工具集,看图:
-mt
线程:如果有这个标记就代表该库是在启用多线程支持的情况下构建的,没有的话就代表没有多线程支持
-gd
ABI(Application Binary Interface,ABI):对影响库与其他已编译代码互操作性的细节编码。简单来说编译模式:
关键字 | 当使用这个库的时候 | Boost.Build 选项 |
---|---|---|
s | 静态链接 | runtime-link=static |
g | 优化后的调试版本,俗称release带调试信息版本 | runtime-debugging=on |
y | 使用python的特殊调试版本 | python-debugging=on |
d | 没有优化调试版本,俗称debug版本 | variant=debug |
p | 使用STLPort标准库,而不是编译器随附的默认库 | stdlib=stlport |
Boost.Build 选项是b2.exe运行的选项
x32
指的是32位程序,有两种模式:x32和x64。官方文档这个地方没有更新,我编译出来的是x32,官网上写的x86。
-1_75
boost的版本号,代表我所使用的1.75.0,因为没有小版本号所以就省略了0
.lib
扩展名:根据操作系统约定确定。Linux为.a和.so,Windows为.lib和.dll
补充
如果想特定的编译boost库,可以看b2 用户手册,手册写的很详细。
接下来,我会写关于Asio库。请看下一篇:《boost入门(二):Asio的简介》
有什么问题,我会及时回复。