windows下編譯boost和提取boost子集
編譯boost
一.下載boost
從boost官網( http://www.boost.org )上下載最新的boost版本,現在最新是1.55版本,解壓到自定義目錄(為了後面好說明,這裡假設為boost_1_55)
2.編譯安裝boost
boost_1_55目錄下會有一個bootstrap.bat批處理,可以直接點選它,會在 boost_1_55\tools\build\v2資料夾下生成兩個exe,b2.exe;bjam.exe,如果報
“cl”不是內部或外部命令,那麼就執行visual studio 命令提示符,cd到 boost_1_55目錄下執行bootstrap.bat ,如果根目錄boost_1_55下沒有b2.exe;
輸入如下命令:
b2 toolset=msvc-10.0 architecture=x86 instruction-set=i686 address-model=32
link=static variant=debug,release threading=multi runtime-link=shared
--without-python --without-mpi --without-wave --without-graph
--without-math --without-serialization stage
使用不同的命令對你使用boost也會產生很大的影響,因為CPU速度和硬碟現在都已經不是大問題了,所以本例中選擇了除了不必要庫的完全編譯,當然了,你時間夠,硬碟夠,可以完全編譯
b2 --toolset=msvc-10.0 --build-type=complete
命令解釋
- toolset:表示編譯器工具,我安裝的是VS2012,所以是msvc-11(如果你是VS2005,可以使用msvc-8.0 VS2008是msvc-9.0)
- architecture:表示架構,也就是你的CPU架構,x86,x64,因為我安裝的是
- instruction-set:表示指令集,依然是8086指令集
- address-model:表示地址長度為32位
- link:表示生成動態/靜態連結庫,動態連結庫是shared,靜態連結庫是static,一般都會編譯成靜態庫,因為給出程式的時候打包boost的庫會非常龐大
- variant:表示生成的Debug或者release版本,一般情況下會兩種版本都會編譯出來的
- threading:表示單/多執行緒編譯,一般我們的程式都會用到多執行緒,所以選擇了multi
- runtime-link:表示動態/靜態連結C/C++執行時庫(C/C++ Runtime),我們選擇了動態連結
- without/with:表示不需要編譯/需要編譯哪些庫,一些自己不用的庫可以無需編譯
- stage/install:stage表示只生成庫檔案(DLL和Lib),install還會生成包含標頭檔案的include
目錄,推薦使用stage,因為boost_1_55\boost中就是boost庫完整的標頭檔案,所以無需再拷貝一份出來。編譯出來的庫會放在stage資料夾中這樣一份完整的boost庫就生成了,剩下就是直接使用到專案中了。
提取boost子集
bcp實用工具
bcp是一個專門用於提取Boost子集元件的工具。對於想要從Boost獨立釋出個人的庫程式碼的Boost開發者,以及想根據自己的需求裁剪/定製Boost的使用者來說,這是一個非常有用的工具。
生成 bcp : cd 到 tools\bcp執行 ..\..\bjam.exe
會在boost根目錄下生成 dist\bin\bcp.exe
cd 到 boost根目錄, 執行.\ dist\bin\bcp.exe asio Export 匯出 asio 到 Export 目錄中
bcp同時可以報告你的程式碼依賴Boost元件以及這些元件使用的licences。
bcp語法
bcp --list [options] module-list
列出module-list及其所有依賴的檔案列表。
bcp [options] module-list output-path
拷貝module-list依賴的所有檔案到output-path目錄。
bcp --report [options] module-list html-file
輸出module-list的所有依賴到html報告中。其中依賴的檔案,包括:licenses、原始碼和測試程式程式碼等。命令選項,包括:
--boost=path
設定boost程式碼樹本地路徑。如果沒有指定此選項,預設會將當前路徑作為Boost程式碼樹的跟目錄。
--scan
將module列表(module list)作為非boost檔案,通過掃描確定對Boost的依賴,不會拷貝或列出模組列表自身相關的檔案。
--svn
僅僅拷貝處於svn版本管理之下的檔案。
--unix-lines
確保所有被拷貝的檔案都採用unix風格的行編輯模式(line endings)。
module-list:
當沒有指定--scan選項時,用於指定待拷貝的boost檔案或庫名列表。這個列表可以是:
一個工具的名稱:如`build`,將找到`tools/build`;
一個庫的名稱:如`regex`;
一個頭檔案的title:如`scoped_ptr`,將找到`boost/scoped_ptr.hpp`;
一個頭檔案的檔名:如`scoped_ptr.hpp`,將找到`boost/scoped_ptr.hpp`;
一個檔名:如`boost/regex.hpp`
當指定了--scan選項時,是一個非Boost(non-boost)的檔案列表,用於掃描其對boost的依賴,這些檔案將不會被拷貝或羅列。
output-path
目標檔案的輸出目錄。
bcp使用示例
bcp scoped_ptr /foo
拷貝boost/scoped_ptr.hpp及其依賴的原始碼到/foo目錄。
bcp boost/regex.hpp /foo
拷貝boost/regex.hpp和所有依賴的程式碼,包括regex原始碼(libs/regex/src)和構建檔案(libs/regex/build)到/foo目錄。但是,不會拷貝regex文件,test,或示/樣例程式碼。
bcp regex /foo
拷貝所有regex庫(libs/regex),包括依賴的程式碼(比如,regex測試程式依賴的boost.test原始碼)到/foo。
bcp regex config build /foo
拷貝所有regex庫(libs/regex),附加config庫(libs/config)和構建系統(tools/build)以及所有的依賴程式碼到/foo。(這個非常有用)
bcp --scan --boost=/boost foo.cpp bar.cpp boost
掃描非boost檔案foo.cpp和bar.cpp對boost的依賴程式碼。同時,將其拷貝到子目錄boost下。(在不明確依賴關係的情況下,這個模式非常有用)
bcp --report regex.hpp boost-regex-report.html
為Boost模組regex.hpp建立一個名為boost-regex-report.html的HTML報告檔案。此報告包含,license資訊,作者明細和檔案依賴。