Boost学习之Boost下载、安装、编译

写在前面
近期项目,涉及到Boost库的编译和更迭,编译以及编译参数等如何设置,一时间让我很头疼,因此决定趁周末,总结一下编译等流程, 方便日后复习。

Boost库是一个非常强大且开源的C++库,是高度可移植的C++模板库。它由C++标准委员发起,且里面很多组件有望成为下一代的C++标准库,其地位将会与STL一样。

Boost按功能分为:字符串、容器、算法、迭代器、数据结构、内存管理、多线程、IO等。其中字符串组中的正规表达式可以与POSIX API和Perl语言处理正则表达式的功能相媲美;内存管理组件如果能合理使用可以杜绝内存泄露,而其效率更是与垃圾收集机制不可同日而语。

Boost的接口(或concept)完全与STL兼容,它在实现上使用了很多STL功能,它本身的组件也可以作为STL容器及算法的元素,所以在使用上,感觉不出是两个类库的差异,我们可以当成是一个类库来使用就行了。只是boost库是在boost::命名空间中。

1、Boost下载

Boost下载非常方便,可以直接访问其官网,点击Download,选择需要的版本下载。如下图,这里下载的是Boost的源码,需要手动编译。
在这里插入图片描述
博主选择的是目前最新版本boost_1.72.0.7z
在这里插入图片描述
如果本地无法编译,或者不需要编译,可以直接下载对应版本的库直接使用,点击查看

2、安装

  1. 如果下载的是安装包,开始安装后,其实也是把Boost的源码和依赖等解压到安装目录下,在不同的编译器下使用,都需要手动编译出对应的库。
  2. 下载源码开发包后,直接解压,即可得到需要的源码。如下图:
    在这里插入图片描述

3、编译

3.1、生成boost的编译工具bjam.exe

不管是解压还是安装的Boost库,都需要重新编译。博主使用VS2013编译,后面将会讲解其他编译器版本编译的参数。

首先使用管理员模式打开 “VS2013开发人员命令提示”,位置在VS2013安装菜单栏“ Visual Studio Tool ”下,如下图:

在这里插入图片描述
打开后,cd到Boost的安装目录,执行 bootstrap.bat,会在boost根目录生成 b2.exebjam.exeproject-config.jambootstrap.log 四个文件。

在这里插入图片描述

其中,b2.exe 、bjam.exe 这两个exe作用是一样的,bjam.exe 是老版本,b2是bjam的升级版本,都是用来编译boost库的程序。

3.2、使用bjam.exe编译boost
3.2.1、编译命令
bjam stage --toolset=msvc-12.0 --without-python --stagedir="E:\boost_1_72_0\bin" link=static runtime-link=shared runtime-link=static threading=multi debug release
3.2.2、命令参数解释

①、stage/install
stage表示只生成库,包括dll和lib,install还会生成包含头文件的include目录。按照自己的习惯选择两者之一就可以,stage编译比较节省时间,不会拷贝头文件;install会将头文件等拷贝到制定目录下,一般会耗时比较多。

②、toolset
指定编译器,可选的如borland、gcc、msvc(VC6)、msvc-9.0(VS2008)、msvc-12.0(VS2013)、msvc-14.0(VS2015)等。

③、without/with
选择不编译/编译哪些库。比如python、mpi等库都用不着,可以不编译。还有wave、graph、math、regex、test、program_options、serialization、signals这几个库编出的静态lib都非常大,所以不需要的也可以without掉。这可以根据各人需要进行选择,默认是全部编译。但是需要注意,如果选择编译python的话,是需要python语言支持的,应该到python官方主页下载安装。
查看Boost包含库的命令:bjam --show-libraries

④、stagedir/prefix
stage时使用stagedir,install时使用prefix ,表示编译生成文件的路径。如果使用了install参数,那么还将生成头文件目录。

⑤、build-dir
编译生成的中间文件的路径。这里没用到,默认就在根目录下,等编译完成后可将这个目录全部删除,所以不需要去设置。

⑥、link
生成动态链接库/静态链接库。生成动态链接库需使用 shared 方式,生成静态链接库需使用 static 方式。一般Boost库可能都是以static方式编译。

⑦、runtime-link
动态/静态 链接C/C++运行时库 。同样有shared和static两种方式,这样runtime-link和link一共可以产生4种组合方式,可以根据自己的需要选择编译。

⑧、threading
单/多线程编译。一般都写多线程程序,当然要指定multi方式了;如果需要编写单线程程序,那么还需要编译单线程库,可以使用single方式。

⑨、debug/release
编译debug/release版本。一般都是程序的debug版本对应库的debug版本,所以两个都编译

3.2.3、开始编译

接着输入上面命令行后,Enter键开始编译,这是个漫长的过程,如果命令行中排除(without)的库较少,可能要1-2小时才能编译完成。尤其是 link, runtime-link这两种运行时状态,以及各自有shared和static两种方式,总共4中组合,所以编译之前需要慎重考虑清楚在开始。

3.2.4、编译结束

编译结束后,目标文件夹“E:\boost_1_72_0\bin”下出现一大堆编译成功的库,看着这些奇诡的命名,很多人可能会比较纳闷,下面将详细介绍一下各个库命名情况:

  1. 以“lib”开头的是“link=static”版本(静态链接库版本,没有dll),而直接以“boost”开头的是“link=shared”版本(动态链接库版本,包含lib和dll)。
  2. 所有的库都含有"boost"前缀。
  3. 紧随其后的是boost库名称(比如date_time库)。
  4. 然后是编译器的版本,与库名称之间以"-“而不是下划线”_"分隔(比如 -vc120)。
  5. 有“mt”的为“threading=multi”版本,没有的则是“threading=single”版本。
  6. 有“s”的为“runtime-link=static”版本,没有的则是“runtime-link=shared”版本。
  7. 有“gd”的为debug版本,没有的则是release版本。
  8. 所有的库都含有boost库的版本号结尾(比如1_56,其中的".“以下划线”_"代替)

4、测试demo

#include <boost\asio.hpp>
#include <iostream>

void handler(const boost::system::error_code& ec)
{
	std::cout << "5s" << std::endl;
}

void handler1(const boost::system::error_code& ec)
{
	std::cout << "2m " << std::endl;
}


int main()
{
	boost::asio::io_service io_service;


	boost::asio::deadline_timer timer(io_service, boost::posix_time::seconds(5));
	timer.async_wait(handler);

	boost::asio::deadline_timer timer1(io_service, boost::posix_time::minutes(2));
	timer1.async_wait(handler1); 

	io_service.run(); 
	return 0;
}

参考资料
https://www.cnblogs.com/zhcncn/p/3950477.html

发布了29 篇原创文章 · 获赞 340 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/Marble_ccp/article/details/105281554