boost_1_54_0/ .................Boost的根目錄html
|
圖1.Boost文件目錄 |
使用boost庫並非全部的庫都須要編譯。只要程序引入頭文件就OK。
舉出反例,下列庫是須要單獨編譯的。
而有些庫能夠選擇是否單獨編譯
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