1.下载boost
2.boost目录结构
boost_1_54_0/ .................Boost的根目录
|
图1.Boost文件目录 |
3.使用boost头文件
- 首先你要把boost这个文件夹拷到系统头文件放置位置。比如/usr/local/include.
- 在程序中引用boost头文件,#include<boost/*/*.hpp>或者#include "boost/*/*.hpp"。
- 为什么叫hpp,即.h+.cpp,因为boost是以template的模板的结构写的,而模板结构写的话,很多编译器不支持头文件和实现文件分离的。故将两者写在一起。
- boost中的组织文件形式并非统一一致的,有的头文件如上是放在某个文件夹下eg.#include<boost/python/def.hpp>,有的老一点或者非常小的库可能就直接放在boost文件夹下,比如#include<boost/*.hpp>,而有的是把所有的头文件做出一个集合的形式放在boost/目录底下,比如boost/python.hpp.
4.只需要使用头文件的库
使用boost库并不是所有的库都需要编译。只要程序引入头文件就OK。
举出反例,下列库是需要单独编译的。
- Boost.Chrono
- Boost.Context
- Boost.Filesystem
- Boost.GraphParallel
- Boost.IOStreams
- Boost.Locale
- Boost.MPI
- Boost.ProgramOptions
- Boost.Python (see the Boost.Python build documentation before building and installing it)
- Boost.Regex
- Boost.Serialization
- Boost.Signals
- Boost.System
- Boost.Thread
- Boost.Timer
- Boost.Wave
而有些库可以选择是否单独编译
- Boost.DateTime 只有当你要使用它的输入输出流或者序列化特征,or你使用vc6、Borland
- Boost.Graph 如果你想使用parse GraphViz files,就编译。
- Boost.Math for the TR1 and C99 cmath functions.
- Boost.Random has binary components for the TR1 and C99 cmath functions.
- Boost.Test 如果需要非常严格的使用环境或要求,则编译。
- Boost.Exception provides non-intrusive implementation of exception_ptr for 32-bit _MSC_VER==1310 and _MSC_VER==1400 which requires a separately-compiled binary. This is enabled by #define BOOST_ENABLE_NON_INTRUSIVE_EXCEPTION_PTR.
5.简单的使用boost库的一个例子
1 /* 2 *输出为输入数字的三倍 3 **/ 4 #include <boost/lambda/lambda.hpp> 5 #include <iostream> 6 #include <iterator> 7 #include <algorithm> 8 int main() 9 { 10 using namespace boost::lambda; 11 typedef std::istream_iterator<int> in; 12 13 std::for_each( 14 in(std::cin), in(), std::cout << (_1 * 3) << " " ); 15 }
有两种方法编译:
1.使用我刚才的方法,把./boost/文件夹(头文件)下所有的文件拷入/usr/local/include,按普通方法编译g++就ok(博主自己使用的)。
2.编译时指定编译路径(即boost根目录) c++ -I boost_1_54_0's_path example.cpp -o example(官方推荐使用)。
ok,第一个使用boost程序就跑通了。
6.编译使用boost库
正如前面所说,部分库是需要使用进行编译的,比如正则。有两种方式,一个是非常简单的(推荐),第二个是可以定制。
6.1简单的编译安装
进入boost根文件,执行下列命令可以获取帮助,当然都是E文,英文好的同学可以看看,讲的非常清楚。ps.请用root权限运行下列命令
$ cd path/to/boost_1_54_0
$ ./bootstrap.sh --help
如果你没有/usr/local(默认将编译后的库放在此目录)的写入权限,需要指定下安装目录。
$ ./bootstrap.sh --prefix=path/to/installation/prefix
指定编译库:可以使用参数--show-libraries获取所有待安装的库,可以使用--with-libraries=库的名称1,库的名称2,.....来安装指定库,或者--without-libraries=list来指定不需要编译的库。不设定的话就是安装默认库。
1 //编译指定库,全部安装的可以跳过 2 $ ./bootstrap.sh ----show-libraries 3 $././bootstrap.sh --with-libraries=name1,name2,name3....
最后执行以下命令进行编译安装,程序将会把头文件放置于/usr/local/include 库放在/usr/local/lib中
$ ./b2 install
如果选择全部编译,将会消耗半个小时左右时间(根据具体机器配置而定),1个G左右硬盘空间。所以编译之前,请确保有这么大的磁盘空间。OK,编译完成,可以忽略以下步骤。
6.2编译定制版
说实话,博主现在还不确定,这个定制版具体和上面那个有什么不同。上面那个可能是使用默认编译器,编译后默认生成release,多线程、静态库+动态库的版本。这个版本可能是可以指定不同编译器,指定具体的编译后的版本,比如单线程,动态库之类。
6.2.1安装Boost.Build
1.进入tools/build/v2/目录
2.执行bootstrap.sh
3.执行b2 install --prefix=PREFIX,PREFIX为b2安装的指定目录
4.将PREFIX/bin加入环境变量,所以博主建议PREFIX设置为/usr/local/
6.2.2调用b2
进入boost根目录,执行b2代码
b2 --build-dir=build-directory toolset=toolset-name stage /*build-directory为中间文件放置的目录,如果当前文件夹不可读比如说光盘,就要指定下。toolset为编译器名称,一般为gcc,stage为当前文件夹下的文件夹,程序将把编译后的库放于此*/
比如如下代码,具体定制版本可以参考这个网站Boost.Build documentation.,或者通过b2 --help查看
$ cd ~/boost_1_54_0 $ b2 --build-dir=/tmp/build-boost toolset=gcc stage
7.连接使用boost库
以正则库为例
#include <boost/regex.hpp> #include <iostream> #include <string> int main() { std::string line; boost::regex pat( "^Subject: (Re: |Aw: )*(.*)" ); while (std::cin) { std::getline(std::cin, line); boost::smatch matches; if (boost::regex_match(line, matches, pat)) std::cout << matches[2] << std::endl; } }
有两种方式:
1.静态库:g++ -o test test.cpp /usr/local/lib/libboost_regex.a.如果你的头文件不在/usr/local/include请用-I指定。
2.动态库:g++ -o test test.cpp -lboost_regex,(如果没找到该库,可以执行ldconfig刷新下)。如果你的动态库的路径不在/usr/local/lib,那么请用 -L参数指定。同时运行时也要指定该动态库的位置。
关于动态库和静态库的区别,限于篇幅问题,请大家自己百度。
程序使用结果:
输入:
To: George Shmidlap From: Rita Marlowe Subject: Will Success Spoil Rock Hunter? --- See subject.
输出为:
To: George Shmidlap From: Rita Marlowe Subject: Will Success Spoil Rock Hunter? --- See subject. Will Success Spoil Rock Hunter?
即用正则表达式,提前Subject后面的字符串。
OK,至此,我们的boost的库就已经搭建成功,以后如果博主有什么新发现会继续更新的。
Wind
2013-11-06