[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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM