[boost c++开源库学习笔记]boost库在Linux下的环境搭建,编译使用 boost_1_54_0版本。

1.下载boost

boost_1_54_0.tar.bz2.

2.boost目录结构

boost_1_54_0/ .................Boost的根目录

index.htm .........boost的讲解文档,可以离线看。和官网的文档一样。

boost/ .........................所有boost的头文件

libs/ ............Tests, .cpps, docs, etc., by library一些测试c++文档,说明文档等等。具体还不清楚

index.html ........库说明文档在此

algorithm/

any/

array/ …more libraries… 等等

status/ .........................Boost-wide test suite

tools/ ...........Utilities, e.g. Boost.Build, quickbook, bcp

more/ ..........................Policy documents, etc.

doc/ ...............boost库说明文档,可以不用管。

图1.Boost文件目录

 

3.使用boost头文件

  1. 首先你要把boost这个文件夹拷到系统头文件放置位置。比如/usr/local/include.
  2. 在程序中引用boost头文件,#include<boost/*/*.hpp>或者#include "boost/*/*.hpp"。
  3. 为什么叫hpp,即.h+.cpp,因为boost是以template的模板的结构写的,而模板结构写的话,很多编译器不支持头文件和实现文件分离的。故将两者写在一起。
  4. boost中的组织文件形式并非统一一致的,有的头文件如上是放在某个文件夹下eg.#include<boost/python/def.hpp>,有的老一点或者非常小的库可能就直接放在boost文件夹下,比如#include<boost/*.hpp>,而有的是把所有的头文件做出一个集合的形式放在boost/目录底下,比如boost/python.hpp.

4.只需要使用头文件的库

使用boost库并不是所有的库都需要编译。只要程序引入头文件就OK。

举出反例,下列库是需要单独编译的。

而有些库可以选择是否单独编译

  • 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

posted @ 2013-11-03 18:52  the wind's words  阅读(4495)  评论(0编辑  收藏  举报