【原】Boost下載安裝編譯配置使用指南(含Windows、Linux以及ARM Linux)

來源:互聯網
上載者:User

——更新於2011/7/19,目前我已對boost的安裝和使用有了新的認識,因此也會對兩年前寫的這篇文章做大幅修改,網上轉載版本泛濫,請以本文為準。

——更新於2013/3/20,增加ARM Linux下的編譯配置方法。 

理論上,本文適用於boost的各個版本,尤其是最新版本1.48.0;適用於各種C++編譯器,如VC6.0(部分庫不支援),VS2003,VS2005,VS2008,VS2010,V2012,gcc,arm-linux-gcc,C++ Builder等。

先總結一下Windows系統。

一、下載

首先從boost官方首頁http://www.boost.org/下載最新版boost安裝包,或者使用Subversion擷取最新版本,地址是:http://svn.boost.org/svn/boost/trunk。本人現在一般都用svn,這樣可以很方便的進行update和build,而不是每次都下載新的安裝包並rebuild。

二、安裝

如果是使用下載的安裝包,那麼請將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)等。  without/with:選擇不編譯/編譯哪些庫。因為python、mpi等庫我都用不著,所以排除之。還有wave、graph、math、regex、test、program_options、serialization、signals這幾個庫編出的靜態lib都非常大,所以不需要的也可以without掉。這可以根據各人需要進行選擇,預設是全部編譯。但是需要注意,如果選擇編譯python的話,是需要python語言支援的,應該到python官方首頁http://www.python.org/下載安裝。查看boost包含庫的命令是 bjam --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目錄就此誕生了。

需要注意的是,如果使用VS2008編譯boost(其他版本VC未作測試,可能也有類似問題),那麼假如你調用boost的主程式添加了_BIND_TO_CURRENT_VCLIBS_VERSION預定義宏來強制使用最新版本的Windows CRT庫,那麼你的boost也需要添加這個預定義宏來進行編譯,否則會導致程式因為各模組使用的CRT庫版本不統一而出現“在某些機器上運行提示‘由於應用程式配置不正確,應用程式未能啟動’的問題”,關於該問題請參考我的另外一篇文章:【原】解決VS2008編譯的程式在某些機器上運行提示“由於應用程式配置不正確,應用程式未能啟動”的問題。添加該預定義宏的方法是:開啟boost安裝根目錄下的boost\config\compiler\visualc.hpp,在最上面增加:

// 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\boostlibrary目錄: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裡的代碼,很容易可以讀懂,並且值得我們學習。

六、Linux下編譯與配置的區別:

我的Linux與Windows使用了共用目錄,將Windows下的E:\SDK目錄映射成了Linux下的/mnt/hgfs/sdk目錄。所以我的boost源檔案根目錄就是/mnt/hgfs/sdk/boost,cd進去。首先需要編譯bjam: ./bootstrap.sh 編譯完成後,會在目前的目錄下產生bjam,接下來開始編譯boost: ./bjam stage --toolset=gcc --with-date_time --with-thread --with-filesystem --with-program_options --stagedir="/mnt/hgfs/sdk/boost/bin/gcc" link=static runtime-link=static threading=multi debug release 這些參數的意義與Windows下完全一樣,只不過編譯器改成gcc,其他選項根據自己的需要進行設定。產生的庫檔案就在bin/gcc/lib目錄下,與vc9編譯的一樣。如果將來不會再升級boost版本,那麼可以把中間檔案全部刪掉,包括bin.v2目錄和tools/jam/stage目錄。關於boost庫的使用,為了不用每次寫makefile都把boost的標頭檔和庫檔案的路徑帶著,而且為了讓跨平台程式公用一套代碼,可以將boost的標頭檔和庫檔案路徑加到Linux的環境變數中。開啟/etc/profile,加入以下gcc環境變數:  CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:"/mnt/hgfs/sdk/boost"
export CPLUS_INCLUDE_PATH

LIBRARY_PATH=$LIBRARY_PATH:"/mnt/hgfs/sdk/boost/bin/gcc/lib"
export LIBRARY_PATH 

這樣就可以直接使用boost的標頭檔和庫檔案了,並且與Windows共用一套代碼,非常方便。

七、ARM Linux下編譯與配置的區別

編輯project-config.jam,修改using gcc這行。改為:
using gcc : arm : arm-linux-gcc ;

注意空格不能刪掉,必須保留;arm-linux-gcc可以換成你自己使用的編譯器。使用bjam開始編譯:

./bjam stage

注意這裡,編譯arm就不能像上面Windows和Linux那樣帶許多參數,否則編譯出錯;在網上看到別人可以使用--with或--without屬性,我沒嘗試,應該是可以的,但其他參數可能就不支援了,有興趣的話可以實驗一下。

八、可參考的網上流行的幾篇文章:

白話C++之安裝boost:http://www.d2school.com/bhcpp_book/2_5.phpWindows VC6編譯安裝Boost庫:http://blog.csdn.net/weekly123/archive/2007/11/23/1899188.aspxboost編譯步驟:http://blog.csdn.net/aheroofeast/archive/2009/03/22/4015458.aspxboost 1.35.0 Visual Studio 2008編譯指南:http://blog.csdn.net/benjiamen/archive/2008/07/12/2643705.aspxVS2008下安裝boost:http://www.cnblogs.com/xdotnet/archive/2008/03/22/boost_install_config.htmlboost 1_43_0 在arm-linux下編譯:http://blog.csdn.net/yujun_huoxu/article/details/7913135
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.