轉載:http://www.cppblog.com/jerryma/archive/2011/10/17/158554.html
——更新于2011/7/19,目前我已對boost的安裝和使用有了新的認識,是以也會對兩年前寫的這篇文章做大幅修改,網上轉載版本泛濫,請以本文為準。
理論上,本文适用于boost的各個版本,尤其是最新版本1.47.0;适用于各種C++編譯器,如VC6.0(部分庫不支援),VS2003,VS2005,VS2008,VS2010,gcc,C++ Builder等。先總結一下Windows系統。
一、下載下傳
二、安裝
如果是使用下載下傳的安裝包,那麼請将boost安裝包解壓至本地目錄,如:E:\SDK\boost;如果是用svn的,也可以将boost的代碼checkout到這個目錄。因為boost一部分類是需要編譯成庫才能使用的,是以我們還需要準備好boost專用的編譯輔助工具bjam。在指令提示符(cmd.exe)中執行根目錄下的bootstrap.bat,編譯後的bjam.exe會自動拷貝到該目錄下(bjam必須與boost-build.jam在同級目錄)。
三、編譯
接下來就是最重要的編譯步驟了。需要打開指令提示符(cmd.exe)視窗并執行bjam,可以使用--help參數來檢視指令幫助。這裡詳細講解一下bjam的指令行參數,因為它非常重要。首先,它涉及到程式設計環境的搭建,你需要根據自己今後具體的使用環境來選擇合适的指令行參數;其次,它影響到你的硬碟空間,完全編譯的話據說在3G以上,如果你同時擁有2個以上的IDE(如VC6和VC9共存)而且都要用到boost,那麼占用多少硬碟就自己算吧……雖說如今大家的硬碟空間都不成問題,但就像本人一樣崇尚合理利用資源不習慣鋪張浪費提倡節儉的童鞋應該大有人在,是以不需要的配置和不需要的庫就可以不編譯了。綜合以上兩點因素,本人使用的bjam指令如下:
bjam stage --toolset=msvc-9.0 --without-graph
--without-graph_parallel --without-math --without-mpi --without-python --without-serialization --without-wave --stagedir="E:\SDK\boost\bin\vc9" link=static
runtime-link=shared runtime-link=static threading=multi debug release
下面詳細解釋一下每個參數的含義:
stage/install:stage表示隻生成庫(dll和lib),install還會生成包含頭檔案的include目錄。本人推薦使用stage,因為install生成的這個include目錄實際就是boost安裝包解壓縮後的boost目錄(E:\SDK\boost\boost,隻比include目錄多幾個非hpp檔案,都很小),是以可以直接使用,而且不同的IDE都可以使用同一套頭檔案,這樣既節省編譯時間,也節省硬碟空間。
toolset:指定編譯器,可選的如borland、gcc、msvc(VC6)、msvc-9.0(VS2008)等。
--show-libraries。
stagedir/prefix:stage時使用stagedir,install時使用prefix,表示編譯生成檔案的路徑。推薦給不同的IDE指定不同的目錄,如VS2008對應的是E:\SDK\boost\bin\vc9,VC6對應的是E:\SDK\boost\bin\vc6,否則都生成到一個目錄下面,難以管理。如果使用了install參數,那麼還将生成頭檔案目錄,vc9對應的就是E:\SDK\boost\bin\vc9\include\boost-1_46\boost,vc6類似(光這路徑都這樣累贅,還是使用stage好)。
build-dir:編譯生成的中間檔案的路徑。這個本人這裡沒用到,預設就在根目錄(E:\SDK\boost)下,目錄名為bin.v2,等編譯完成後可将這個目錄全部删除(沒用了),是以不需要去設定。
link:生成動态連結庫/靜态連結庫。生成動态連結庫需使用shared方式,生成靜态連結庫需使用static方式。一般boost庫可能都是以static方式編譯,因為最終釋出程式帶着boost的dll感覺會比較累贅。
runtime-link:動态/靜态連結C/C++運作時庫。同樣有shared和static兩種方式,這樣runtime-link和link一共可以産生4種組合方式,各人可以根據自己的需要選擇編譯。一般link隻選static的話,隻需要編譯2種組合即可,即link=static runtime-link=shared和link=static runtime-link=static,本人一般就編這兩種組合。
threading:單/多線程編譯。一般都寫多線程程式,當然要指定multi方式了;如果需要編寫單線程程式,那麼還需要編譯單線程庫,可以使用single方式。
debug/release:編譯debug/release版本。一般都是程式的debug版本對應庫的debug版本,是以兩個都編譯。
本人按以上方式分别編譯了靜态連結和動态連結兩個版本後,整個E:\SDK\boost目錄有1.28G。如果不打算将來再更新boost版本,那麼可以将編譯生成的中間檔案bin.v2目錄删除,這樣整個目錄(包括安裝包解壓縮檔案和編譯生成的庫檔案)會減小至不到800MB,如果runtime-link隻選了一種方式,那麼整個目錄隻有600MB。事實上編譯完成後除了boost和bin目錄之外其他目錄和檔案已經可以删除了,這樣還可以騰出350MB的空間來。不過我又研究了一下,其實libs這個目錄也很有用,它提供了所有Boost類的使用範例,平時可以作為參考;另外doc目錄是一個完整的boost使用幫助文檔,當然最好也不要删了。其他幾個目錄和檔案加起來也就幾十兆,索性都給它們留一條生路吧。
呵呵,一個完整而又完美的boost目錄就此誕生了。
// Added by terry, 2011/4/19, Force the linker to use the latest version
of CRT/MFC/ATL dll
#ifndef _BIND_TO_CURRENT_VCLIBS_VERSION
#define _BIND_TO_CURRENT_VCLIBS_VERSION 1
#endif // _BIND_TO_CURRENT_VCLIBS_VERSION
這種方法修改了boost的源碼,并非我所願, 但是無奈沒有找到更好的方法,如果有人知道希望能夠留言告訴我。
如果圖省事,不想了解這麼多,那麼有簡單的方法,可以使用指令:
bjam --toolset=msvc-9.0 --build-type=complete
直接指定編譯器以完全模式編譯即可,這樣可以滿足今後的一切使用場合,但同時帶來的後果是:
1、占用3G以上的硬碟空間
2、占用若幹小時的編譯時間
3、頭檔案和庫檔案存放于C:\Boost(本人非常反感)
4、生成的很多檔案可以永遠也用不上
四、配置
include目錄:E:\SDK\boost
library目錄:E:\SDK\boost\bin\vc9\lib
添加到IDE相應的路徑下面即可。
五、使用
使用舉例:
#include <boost\thread.hpp>
此時,不用包含庫檔案,boost的auto-link機制将會自動幫我們包含對應的靜态lib。也就是說,boost預設是以靜态方式連結的,這樣我們的工程屬性最好也設為Multi-threaded (Debug)。如果想使用dll動态方式連結,需要預先定義宏:
#define BOOST_ALL_DYN_LINK
同樣,此時boost也會預設幫我們包含對應的lib。如果不想使用boost提供的auto-link機制,或者對它的自動連結不太放心的話(其實大可不必擔心),可以預先定義宏:
#define BOOST_ALL_NO_LIB
然後使用以下方法連結:
#pragma comment(lib, "boost_thread-vc90-mt-1_47.lib")
或
#pragma comment(lib, "boost_thread-vc90-mt.lib")
這兩個lib其實是一樣的,實在不明白boost編譯時為什麼每個庫都要複制一份,難道是因為後者在更新boost版本後不用改代碼?另外還有一個比較有用的宏:
#define BOOST_LIB_DIAGNOSTIC
它可以讓VC在編譯時的output視窗中輸出程式具體連結了哪些boost庫以及連結順序。
關于boost的auto-link機制,詳細可以看看boost\config\auto_link.hpp裡的代碼,很容易可以讀懂,并且值得我們學習。