由于跨平台的缘由,如今要使用到boost库,boost库很是大,如今处于摸索阶段。html
首先来讲boost库在window下的安装和使用。python
1、下载编程
首先从boost官方主页http://www.boost.org/下载最新版boost安装包,或者使用Subversion获取最新版本,地址是:http://svn.boost.org/svn/boost/trunk。本人如今通常都用svn,这样能够很方便的进行update和build,而不是每次都下载新的安装包并rebuild。bootstrap
2、安装多线程
若是是使用下载的安装包,那么请将boost安装包解压至本地目录,如:E:\SDK\boost;若是是用svn的,也能够将boost的代码checkout到这个目录。由于boost一部分类是须要编译成库才能使用的,因此咱们还须要准备好boost专用的编译辅助工具bjam。在命令提示符(cmd.exe)中执行根目录下的bootstrap.bat,编译后的bjam.exe会自动拷贝到该目录下(bjam必须与boost-build.jam在同级目录)。svn
3、编译----我使用的是vs2008工具
接下来就是最重要的编译步骤了。须要打开命令提示符(cmd.exe)窗口并执行bjam,可使用--help参数来查看命令帮助。这里详细讲解一下bjam的命令行参数,由于它很是重要。首先,它涉及到编程环境的搭建,你须要根据本身从此具体的使用环境来选择合适的命令行参数;其次,它影响到你的硬盘空间,彻底编译的话听说在3G以上,若是你同时拥有2个以上的IDE(如VC6和VC9共存)并且都要用到boost,那么占用多少硬盘就本身算吧……虽然说现在你们的硬盘空间都不成问题,但就像本人同样崇尚合理利用资源不习惯铺张浪费提倡节俭的童鞋应该大有人在,因此不须要的配置和不须要的库就能够不编译了。综合以上两点因素,本人使用的bjam命令以下:
bjam stage --toolset=msvc-9.0 --without-graph --without-graph_parallel --without-math --without-mpi --without-python --without-serialization --without-wave --stagedir="E:\SDK\boost\bin\vc9" link=static runtime-link=shared runtime-link=static threading=multi debug release
下面详细解释一下每一个参数的含义:学习
stage/install:stage表示只生成库(dll和lib),install还会生成包含头文件的include目录。本人推荐使用stage,由于install生成的这个include目录实际就是boost安装包解压缩后的boost目录(E:\SDK\boost\boost,只比include目录多几个非hpp文件,都很小),因此能够直接使用,并且不一样的IDE均可以使用同一套头文件,这样既节省编译时间,也节省硬盘空间。
toolset:指定编译器,可选的如borland、gcc、msvc(VC6)、msvc-9.0(VS2008)等。
without/with:选择不编译/编译哪些库。由于python、mpi等库我都用不着,因此排除之。还有wave、graph、math、regex、test、program_options、serialization、signals这几个库编出的静态lib都很是大,因此不须要的也能够without掉。这能够根据各人须要进行选择,默认是所有编译。可是须要注意,若是选择编译python的话,是须要python语言支持的,应该到python官方主页
http://www.python.org/下载安装。查看boost包含库的命令是
bjam --show-libraries。
stagedir/prefix:stage时使用stagedir,install时使用prefix,表示编译生成文件的路径。推荐给不一样的IDE指定不一样的目录,如VS2008对应的是E:\SDK\boost\bin\vc9,VC6对应的是E:\SDK\boost\bin\vc6,不然都生成到一个目录下面,难以管理。若是使用了install参数,那么还将生成头文件目录,vc9对应的就是E:\SDK\boost\bin\vc9\include\boost-1_46\boost,vc6相似(光这路径都这样累赘,仍是使用stage好)。
build-dir:编译生成的中间文件的路径。这个本人这里没用到,默认就在根目录(E:\SDK\boost)下,目录名为bin.v2,等编译完成后可将这个目录所有删除(没用了),因此不须要去设置。
link:生成动态连接库/静态连接库。生成动态连接库需使用shared方式,生成静态连接库需使用static方式。通常boost库可能都是以static方式编译,由于最终发布程序带着boost的dll感受会比较累赘。
runtime-link:动态/静态连接C/C++运行时库。一样有shared和static两种方式,这样runtime-link和link一共能够产生4种组合方式,各人能够根据本身的须要选择编译。通常link只选static的话,只须要编译2种组合便可,即link=static runtime-link=shared和link=static runtime-link=static,本人通常就编这两种组合。
threading:单/多线程编译。通常都写多线程程序,固然要指定multi方式了;若是须要编写单线程程序,那么还须要编译单线程库,可使用single方式。
debug/release:编译debug/release版本。通常都是程序的debug版本对应库的debug版本,因此两个都编译。
本人按以上方式分别编译了静态连接和动态连接两个版本后,整个E:\SDK\boost目录有1.28G。若是不打算未来再升级boost版本,那么能够将编译生成的中间文件bin.v2目录删除,这样整个目录(包括安装包解压缩文件和编译生成的库文件)会减少至不到800MB,若是runtime-link只选了一种方式,那么整个目录只有600MB。事实上编译完成后除了boost和bin目录以外其余目录和文件已经能够删除了,这样还能够腾出350MB的空间来。不过我又研究了一下,其实libs这个目录也颇有用,它提供了全部Boost类的使用范例,平时能够做为参考;另外doc目录是一个完整的boost使用帮助文档,固然最好也不要删了。其余几个目录和文件加起来也就几十兆,索性都给它们留一条生路吧。
呵呵,一个完整而又完美的boost目录就此诞生了。
须要注意的是,若是使用VS2008编译boost(其余版本VC未做测试,可能也有相似问题),那么假如你调用boost的主程序添加了_BIND_TO_CURRENT_VCLIBS_VERSION预约义宏来强制使用最新版本的Windows CRT库,那么你的boost也须要添加这个预约义宏来进行编译,不然会致使程序由于各模块使用的CRT库版本不统一而出现“在某些机器上运行提示‘因为应用程序配置不正确,应用程序未能启动’的问题”,关于该问题请参考个人另一篇文章:【原】解决VS2008编译的程序在某些机器上运行提示“因为应用程序配置不正确,应用程序未能启动”的问题。添加该预约义宏的方法是:打开boost安装根目录下的boost\config\compiler\visualc.hpp,在最上面增长:测试
// Added by terry, 2011/4/19, Force the linker to use the latest version of CRT/MFC/ATL dll
#ifndef _BIND_TO_CURRENT_VCLIBS_VERSION
#define _BIND_TO_CURRENT_VCLIBS_VERSION 1
#endif // _BIND_TO_CURRENT_VCLIBS_VERSION
这种方法修改了boost的源码,并不是我所愿, 可是无奈没有找到更好的方法,若是有人知道但愿可以留言告诉我。ui
若是图省事,不想了解这么多,那么有简单的方法,可使用命令:
bjam --toolset=msvc-9.0 --build-type=complete
直接指定编译器以彻底模式编译便可,这样能够知足从此的一切使用场合,但同时带来的后果是:
一、占用3G以上的硬盘空间
二、占用若干小时的编译时间
三、头文件和库文件存放于C:\Boost(本人很是反感)
四、生成的不少文件能够永远也用不上
4、配置
include目录:E:\SDK\boost
library目录:E:\SDK\boost\bin\vc9\lib
添加到IDE相应的路径下面便可。
5、使用
使用举例:
#include <boost\thread.hpp>
此时,不用包含库文件,boost的auto-link机制将会自动帮咱们包含对应的静态lib。也就是说,boost默认是以静态方式连接的,这样咱们的工程属性最好也设为Multi-threaded (Debug)。若是想使用dll动态方式连接,须要预先定义宏:
#define BOOST_ALL_DYN_LINK
一样,此时boost也会默认帮咱们包含对应的lib。若是不想使用boost提供的auto-link机制,或者对它的自动连接不太放心的话(其实大可没必要担忧),能够预先定义宏:
而后使用如下方法连接:
#pragma comment(lib, "boost_thread-vc90-mt-1_47.lib")
或
#pragma comment(lib, "boost_thread-vc90-mt.lib")
这两个lib实际上是同样的,实在不明白boost编译时为何每一个库都要复制一份,难道是由于后者在升级boost版本后不用改代码?另外还有一个比较有用的宏:
#define BOOST_LIB_DIAGNOSTIC
它可让VC在编译时的output窗口中输出程序具体连接了哪些boost库以及连接顺序。
关于boost的auto-link机制,详细能够看看boost\config\auto_link.hpp里的代码,很容易能够读懂,而且值得咱们学习。