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