編譯boost

理論上,本文適用於boost的各個版本,尤其是最新版本1.45.0;適用於各種C++編譯器,如VC6.0(部分庫不支持),VS2003,VS2005,VS2008,gcc,C++ Builder等。先總結一下Windows系統。

一、下載
首先從boost官方主頁http://www.boost.org/下載最新版boost安裝包(目前最新版是boost_1_45_0.7z)。
二、安裝
將boost安裝包解壓至本地目錄,如:E:\SDK\boost_1_45_0。因爲boost一部分類是需要編譯成庫才能使用的,所以我們還需要準備好boost專用的編譯輔助工具bjam。在命令提示符(cmd.exe)中執行根目錄下的bootstrap.bat(注:若執行此腳本後長時間無反應,可參考這裏解決http://mayacong.blog.51cto.com/3724695/1103800),編譯後的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_1_45_0\bin\vc9" link=static runtime-link=shared threading=multi debug release

注:--stagedir選項不正確,我用的版本是1_49_0,但影響並不大,庫名會包含編譯器名和版本號,所以不同編譯器、不同版本編譯器編譯出的文件絕對不會重複,讓它們自動生成到stage\lib目錄,然後再自己整理即可。

下面詳細解釋一下每個參數的含義,請務必仔細看完:
stage/install:stage表示只生成庫(dll和lib),install還會生成包含頭文件的include目錄。本人推薦使用stage,因爲install生成的這個include目錄實際就是boost安裝包解壓縮後的boost目錄(E:\SDK\boost_1_45_0\boost,只比include目錄多幾個非hpp文件,都很小),所以可以直接使用,而且不同的IDE都可以使用同一套頭文件,這樣既節省編譯時間,也節省硬盤空間。
toolset:指定編譯器,可選的如borland、gcc、msvc(VC6)、msvc-9.0(VS2008)等。
without/with:選擇不編譯/編譯哪些庫。因爲python、mpi等庫我都用不着,所以排除之。另外,wave、graph、math、regex、test、program_options、serialization、signals這幾個庫編出的靜態lib都非常大,所以不需要的也可以without掉。這可以根據各人需要選擇,默認是全部編譯。但是需要注意,如果選擇編譯python的話,是需要python語言支持的,應該到python官方主頁http://www.python.org/下載安裝。
stagedir/prefix:stage時使用stagedir,install時使用prefix,表示編譯生成文件的路徑。推薦給不同的IDE指定不同的目錄,如VS2008對應的是E:\SDK\boost_1_45_0\bin\vc9,VC6對應的是E:\SDK\boost_1_45_0\bin\vc6,否則都生成到一個目錄下面,難以管理。如果使用了install參數,那麼還將生成頭文件目錄,vc9對應的就是E:\SDK\boost_1_45_0\bin\vc9\include\boost-1_45\boost,vc6類似(光這路徑都這樣累贅,還是使用stage好)。
build-dir:編譯生成的中間文件的路徑。這個本人這裏沒用到,默認就在根目錄(E:\SDK\boost_1_45_0)下,目錄名爲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版本,所以兩個都編譯。注:debug版程序也可以連接release版的boost,但不能調試到boost源碼。
本人按以上方式分別編譯了靜態鏈接和動態鏈接兩個版本後,整個E:\SDK\boost_1_45_0目錄(包括安裝包解壓縮文件和編譯生成的庫文件)只有不到500MB。事實上編譯完成後安裝包解壓縮文件除了boost目錄之外其他目錄和文件已經可以刪除了,這樣還可以騰出150MB的空間來。不過我又研究了一下,其實libs這個目錄也很有用,它提供了所有Boost類的使用範例,平時可以作爲參考;另外doc目錄是一個完整的boost使用幫助文檔,當然最好也不要刪了。這樣剩下的幾個目錄和文件加起來也就十多兆,索性都給它們留一條生路吧。
呵呵,一個完整而又完美的boost目錄就此誕生了。
如果圖省事,不想了解這麼多,那麼有簡單的方法,可以使用命令:
bjam --toolset=msvc-9.0 --build-type=complete
直接指定編譯器以完全模式編譯即可,這樣可以滿足今後的一切使用場合,但同時帶來的後果是:
1、佔用3G以上的硬盤空間
2、佔用若干小時的編譯時間
3、頭文件和庫文件存放於C:\Boost(個人非常反感)

 

4、生成的很多文件可以永遠也用不上
四、配置
include目錄:E:\SDK\boost_1_45_0
library目錄:E:\SDK\boost_1_45_0\bin\vc9
添加到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_45.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裏的代碼,很容易可以讀懂,並且值得我們學習。
六、Linux下編譯與配置的區別:
我的Linux與Windows使用了共享目錄,將Windows下的E:\SDK目錄映射成了Linux下的/mnt/hgfs/sdk目錄。
所以我的boost源文件根目錄就是/mnt/hgfs/sdk/boost_1_45_0,cd進去。
首先需要編譯bjam:
 
cd tools/jam
./build_dist.sh
 
我在虛擬機的Linux下編譯bjam的時候最後會卡住,屏幕顯示到mkdir的地方就不往下走了,不過其實這時候bajm已經編譯完成。
接下來將stage/bin.linuxx86目錄下生成的bjam拷貝到boost源文件根目錄boost_1_45_0下,cd進去,開始編譯boost:
 
./bjam stage --toolset=gcc --with-date_time --with-thread --with-filesystem --with-program_options --stagedir="/mnt/hgfs/sdk/boost_1_45_0/bin/gcc" link=static runtime-link=static threading=multi debug release
 
這些參數的意義與Windows下完全一樣,只不過編譯器改成gcc,其他選項根據自己的需要進行設置。
生成的庫文件就在bin/gcc/lib目錄下,與vc9編譯的一樣,lib目錄感覺是多餘的,手動將庫文件拷貝到gcc目錄下,刪掉lib目錄,這屬於個人喜好問題。
然後把中間文件全部刪掉,包括bin.v2目錄和tools/jam/stage目錄。
關於boost庫的使用,爲了不用每次寫makefile都把boost的頭文件和庫文件的路徑帶着,而且爲了讓跨平臺程序公用一套代碼,
可以將boost的頭文件和庫文件路徑加到Linux的環境變量中。打開/etc/profile,加入以下gcc環境變量: 
 
CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:"/mnt/hgfs/sdk/boost_1_45_0"
export CPLUS_INCLUDE_PATH

LIBRARY_PATH=$LIBRARY_PATH:"/mnt/hgfs/sdk/boost_1_45_0/bin/gcc"
export LIBRARY_PATH
 
這樣就可以直接使用boost的頭文件和庫文件了,並且與Windows共用一套代碼,非常方便。
七、可參考的網上流行的幾篇文章:
白話C++之安裝boost:http://www.d2school.com/bhcpp_book/2_5.php
Windows VC6編譯安裝Boost庫:http://blog.csdn.net/weekly123/archive/2007/11/23/1899188.aspx
boost編譯步驟:http://blog.csdn.net/aheroofeast/archive/2009/03/22/4015458.aspx
boost 1.35.0 Visual Studio 2008編譯指南:http://blog.csdn.net/benjiamen/archive/2008/07/12/2643705.aspx
VS2008下安裝boost:http://www.cnblogs.com/xdotnet/archive/2008/03/22/boost_install_config.html
-- 本文來源於創世軟件團隊博客, 原文地址: http://www.cnblogs.com/wondering/archive/2009/05/21/boost_setup.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章