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

1.下载boost

boost_1_54_0.tar.bz2.php

2.boost目录结构

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

index.htm .........boost的讲解文档,能够离线看。和官网的文档同样。python

boost/ .........................全部boost的头文件ios

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

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

algorithm/正则表达式

any/bootstrap

array/ …more libraries… 等等多线程

status/ .........................Boost-wide test suitedom

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

相关文章
相关标签/搜索