天天看點

VS2010 Boost編譯安裝

1.下載下傳安裝包boost 1_46_0

http://www.boost.org/users/news/version_1_46_0

選擇下載下傳 windows 或 unix 版本

2.解壓縮到D:\boost 目錄下

3.編譯bjam

(1)從vs2010的工具菜單進入指令提示視窗(單擊“開始”按鈕,指向“所有程式”,指向“Microsoft Visual Studio 2010”,指向“Visual Studio tools(工具)”,然後單擊“Visual Studio 2010 command prompt(指令提示)” 

(2)cd到D:\boost\boost_1_46_0下執行bootstrap.bat,然後,會在D:\boost\boost_1_46_0\下生成bjam.exe

4.設定編譯環境(如果想去掉編譯警告需要修改)  

修改user-config.jam (D:\boost\boost_1_46_0\tools\build\v2\user-config.jam) 的MSVC configuration

# MSVC configuration 

# Configure msvc (default version, searched for in standard locations and PATH).

# using msvc ;

using msvc : 10.0 : : <compileflags>/wd4819 <compileflags>/D_CRT_SECURE_NO_DEPRECATE <compileflags>/D_SCL_SECURE_NO_DEPRECATE <compileflags>/D_SECURE_SCL=0 ;

5.將目錄cd到D:\boost\boost_1_46_0\下執行 

    (1) 編譯boost庫  

      單程序

        bjam stage --without-python --toolset=msvc-10.0 --build-type=complete --stagedir="D:\boost\boost_1_46_0\bin\vc10" (這一步需要等待很長時間,大概一個小時左右……)

      多程序

      bjam stage --without-python --toolset=msvc-10.0 --build-type=complete --threading=multi --stagedir="C:\boost_1_49_0\bin\vc10"

下面詳細解釋一下每個參數的含義:

stage/install:stage表示隻生成庫(dll和lib),install還會生成包含頭檔案的include目錄。

toolset:指定編譯器,可選的如borland、gcc、msvc(VC6)、msvc-10.0(VS20010)等。

without/with:選擇不編譯/編譯哪些庫。

stagedir/prefix:stage時使用stagedir,install時使用prefix,表示編譯生成檔案的路徑。推薦給不同的IDE指定不同的目錄,如VS2010對應的是D:\boost\boost_1_46_0\bin\vc10,否則都生成到一個目錄下面,難以管理。

build-dir:編譯生成的中間檔案的路徑。這個本人這裡沒用到,預設就在根目錄(D:\boost\boost_1_46_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版本,是以兩個都編譯。

運作完後(彈出輸入提示符) 

6.設定vs2010環境。(注:在2010環境下這步,在項目-->右鍵屬性-->VC++ Directories 中去填寫對應路徑 )

修改環境變量:$(BOOST):  D:\boost\boost_1_46_0

Tools -> Options -> Projects and Solutions -> VC++ Directories 

在Library files加上$(BOOST)\bin\vc10\lib

在Include files加上$(BOOST)

使用舉例:

#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-vc100-mt-1_46.lib")或

#pragma comment(lib, "boost_thread-vc100-mt.lib")

這兩個lib其實是一樣的,實在不明白boost編譯時為什麼每個庫都要複制一份,難道是因為後者在更新boost版本後不用改代碼?另外還有一個比較有用的宏:

#define BOOST_LIB_DIAGNOSTIC

它可以讓VC在編譯時的output視窗中輸出程式具體連結了哪些boost庫以及連結順序。

關于boost的auto-link機制,詳細可以看看boost\config\auto_link.hpp裡的代碼,很容易可以讀懂,并且值得我們學習。

7.測試例子

右鍵工程->屬性->C/C++->附加包含目錄(解壓boost的根目錄,我的路徑為:C:\boost_1_49_0)

右鍵工程->屬性->連接配接器->附加庫目錄(編譯生成的dll和lib的目錄,我的路徑是C:\boost_1_49_0\bin\vc10\lib)

#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;

    }

}