[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

相關文章
相關標籤/搜索