| http://bujibuji2010.blog.sohu.com/154153377.html 
 
 方法一:
 經(jīng)歷了將近半年多的時(shí)間boost終于發(fā)布了1.35.0版本(前版本1.34.1發(fā)布于2007/7),其編譯方法和原來的編譯方法基本上是一致的,主要改變包括1.34.0以來bjam的toolset所
 提供的參數(shù)名稱的改變(具體參見《boost1.34.0編譯日志》)外,還包括bjam的編譯默認(rèn)
 選項(xiàng)的變化,在1.35.0之前的版本默認(rèn)編譯時(shí)會(huì)自動(dòng)編譯各種版本的庫,包括靜態(tài)庫、
 動(dòng)態(tài)庫、debug庫和release庫等全部的版本,但是到了1.35.0時(shí)默認(rèn)的選擇僅僅編譯release
 版本的庫,這樣一來在開發(fā)的時(shí)候就不能進(jìn)行必要的調(diào)試了,為了能夠使其編譯全部的版本
 需要在bjam的命令行參數(shù)中添加一個(gè)--build-type=complete類型的參數(shù)來指明需要編譯全
 部的版本,所需要編譯同時(shí)為了使得regex庫能夠通過ICU庫支持Unicode,在編譯上需要有
 一些特殊的選擇。我在Visual Studio 2005 Pro + SP1環(huán)境下編譯了該庫,為了避免走彎路
 所以將其編譯的方法進(jìn)行說明,以方便大家編譯。
 由于boost是采用其自己的bjam工具通過命令行進(jìn)行編譯的,所以必須在Windows下開啟console窗口,同時(shí)必須將Visual Studio中C++目錄下的環(huán)境vcvarsall.bat配置腳本運(yùn)行一遍,以設(shè)置好VC的編譯器環(huán)境變量。
 1. 編譯不帶ICU支持的boost庫
 此種情況下的boost庫編譯起來比較的簡(jiǎn)單,在準(zhǔn)備好的console窗口中輸入:
 bjam --without-python --toolset=msvc-8.0 --build-type=complete stage
 就可以了,如果要安裝的話則輸入:
 bjam --without-python --toolset=msvc-8.0 --build-type=complete install
 
 2. 編譯具有ICU支持的boost庫
 首先我們必須編譯ICU庫才能夠編譯boost庫,在準(zhǔn)備好的console窗口中輸入:
 bjam -sICU_PATH=d:\ICU --without-python --toolset=msvc-8.0 --build-type=complete stage
 就可以了,如果要安裝的話則輸入:
 bjam -sICU_PATH=d:\ICU --without-python --toolset=msvc-8.0 --build-type=complete install
 通過上面的方法可以很正常完成boost各種需要版本的關(guān)系。
 每次用bjam編譯boost總是要查看幫助文件才行。雖然現(xiàn)在的bjam編譯命令只有兩三個(gè)參數(shù),可是不小心還是會(huì)錯(cuò)。
 1. toolset參數(shù)中,試圖用vc,正確的應(yīng)該是msvc。vc用于庫文件的命名后綴中。兩個(gè)名字能統(tǒng)一就好了。
 2. 編譯工具的版本號(hào)應(yīng)該用點(diǎn)號(hào)分隔,并且總是應(yīng)該指定該版本號(hào)。如msvc-71是錯(cuò)誤的,應(yīng)該用msvc-7.1。
 小版本號(hào)不能省,如msvc-6.0不能寫成msvc-6。
 版本號(hào)指定錯(cuò)誤,可能也能編譯,但是生成庫的名字是錯(cuò)的。
 3. 使用stlport。要在user-config.jam中配置stlport,
 例如:using stlport : : F:\STLport-5.1.0\stlport F:\STLport-5.1.0\lib ;
 并且別忘了在參數(shù)中加上參數(shù):--stdlib=stlport。
 user-config.jam中的stlport配置可以一直保持開啟,
 因?yàn)樽罱K是由stdlib參數(shù)決定是否使用stlport。
 方法二: 1.點(diǎn)擊 開始->程序->Microsoft Visual Studio 2005->Visual Studio Tools->Visual Studio 2005 命令提示2.cd D:\Libs\boost_1_35_0\tools\jam\src
 3.build.bat
 此時(shí)在src\bin.ntx86\目錄下產(chǎn)生了bjam.exe
 4.將bjam.exe拷貝到boost的根目錄D:\Libs\boost_1_35_0
 5.cd D:\Libs\boost_1_35_0
 6.bjam.exe --build-dir=build --toolset=msvc stage
 
 編
譯完成后,產(chǎn)生了2個(gè)目錄build和stage,但同時(shí)也發(fā)現(xiàn)一個(gè)奇怪問題:stage里面的文件,竟然有很多相同的lib,比如
boost_date_time-vc80-mt-1_35.lib和boost_date_time-vc80-
mt.lib,boost_filesystem-vc80-mt-1_35.lib和boost_filesystem-vc80-mt.lib他們文
件的大小一樣,只是文件名稍微不同,一個(gè)帶有版本號(hào),另一個(gè)沒有。編譯的問題,還是boost本身有
 方法三:  一、下載安裝:   下載boost 1.31,解壓縮至一個(gè)文件夾,本文以[boost-path]來引用這個(gè)路徑。   二、編譯準(zhǔn)備工作:   首先是編譯jam,在< boost-path >\tools\build\v1下,把vc7.1-tools.jam文件復(fù)制一份,改名為vc80-tools.jam,我暫時(shí)未測(cè)試stl-port。   修改文件內(nèi)容里的路徑,這個(gè)根據(jù)你的安裝路徑來改。去掉幾個(gè)flag行,以后編譯時(shí)就少一些警告。修改以后內(nèi)容如下: extends-toolset msvc ; # singleton variables...set-as-singleton VC80_ROOT ;
 if ! $(MSVCDir){
 ProgramFiles ?= $(PROGRAMFILES) ;
 VC80_ROOT ?= $(ProgramFiles:J=" ")\\Microsoft Visual Studio 8\\VC" ;
 VC_TOOL_PATH = "$(VC80_ROOT)\\bin\\ ;
 VC_SETUP = "CALL \"$(VC_TOOL_PATH)VCVARS32.BAT\" >nul" ;
 }
 VC_PDB_NAME = vc80 ;
 flags vc80 C++FLAGS on : /Zc:wchar_t ;
   然后打開VC2005程序組里面的Visual Studio Command Prompt,這能確保已加載環(huán)境變量,減少后面一些操作過程。在[boost-path]\tools\build\jam-src目錄下運(yùn)行: build -sTOOLS=vc80    編譯會(huì)通過的,最后鏈接時(shí)會(huì)報(bào)錯(cuò),之后想到的方法如下: .\bootstrap.vc7\jam0 -f build.jam --toolset=vc7 "--toolset-root=C:\Program Files\Microsoft Visual Studio 8\VC"   注:這個(gè)選項(xiàng)不能直接附加在build批處理后面,所以要這樣調(diào)用。   好了,bjam編譯完成。下面編譯boost,有2個(gè)文件需要改一下:   [boost-path]\boost\config\auto_link.hpp在第118行附近改為: #elif defined(BOOST_MSVC) && (BOOST_MSVC == 1310) // vc71:# define BOOST_LIB_TOOLSET "vc71"
 #elif defined(BOOST_MSVC) && (BOOST_MSVC >= 1400) // vc80:# define BOOST_LIB_TOOLSET "vc80"
   注:如果你不修改這里,那么后面測(cè)試時(shí)無法鏈接到正確的lib,因?yàn)榍懊嫖覀円呀?jīng)使用了“VC.NET 2005”,生成的lib全是VC.NET 2005的。   [boost-path]\boost\config\compile\visualc.hpp最后面的>1310改為1400,如下: #if (_MSC_VER?> 1400)   注:如果不修改這個(gè),無法正確生成所需要的lib。   這些文件修改就完成了。如果你需要boost-python,那么還需設(shè)置幾個(gè)環(huán)境變量,注意路徑替換為你自己的,版本號(hào)只留前2位,比如2.3.4,則只需要寫上2.3。 SET PYTHON_ROOT=c:\soft\python24SET PYTHON_VERSION=2.4
 SET PYTHON_LIB_PATH=c:\soft\python24\libs
   三、編譯:   以上過程都完畢了,現(xiàn)在轉(zhuǎn)到[boost-path]目錄下,運(yùn)行如下命令: tools\build\jam_src\bin.ntx86\bjam -sTOOLS=vc80 "-sBUILD=debug release static/dynamic single/multi"   編譯完成以后,設(shè)置VC2005的include和lib路徑,最好搜索一下*.lib,拷到一個(gè)文件夾下,接下來就可以測(cè)試了。   四、測(cè)試:   寫了一段測(cè)試正則表達(dá)式的代碼,編譯、鏈接,結(jié)果是報(bào)錯(cuò)。原來是要鏈接多線程版本!在VC2005里找了一下,發(fā)現(xiàn)只有多線程選項(xiàng),單線程竟然沒有列進(jìn)來。   這中間我走了一點(diǎn)彎路,試圖編譯一個(gè)多線程版本的boost,結(jié)果發(fā)現(xiàn)不行,編譯出來還是單線程的,就線程庫是多線程版本。   最后用了個(gè)蠢辦法:在#include < stdafx.h >后面加上一句:#undef _MT,終于可以運(yùn)行起來了。   五、補(bǔ)充說明:   如果系統(tǒng)中有MSVCDir
這個(gè)環(huán)境變量,VC80_ROOT這個(gè)變量將會(huì)被忽略掉。由于vc2005對(duì)C++的標(biāo)準(zhǔn)庫增加了更嚴(yán)格的安全性檢測(cè),所以在VC2005里使用
boost會(huì)得到很多假的警告,可以通過定義 _SCL_SECURE_NO_DEPRECATE 或者加入#pragma
warning(disable:4996)來處理掉,另外一些是因?yàn)槟承├系腃庫函數(shù)被VC2005聲明為deprecated(不贊成使用的),例如
fopen, str*字符串函數(shù)等。 方法四: boost庫是一個(gè)跨平臺(tái)的C++庫,因此它的安裝多少有些麻煩——如果你需要使用那些必須編譯的庫的時(shí)候。在windows平臺(tái)上(使用
VS2003和VS2005)最簡(jiǎn)單的辦法就是從
http://www./download/windows?下載boost庫的installer,使用它可
以指定安裝基于哪個(gè)開發(fā)環(huán)境的庫,每個(gè)庫安裝那些版本,非常方便,免去了配置編譯之苦。 編譯了一個(gè)使用正則表達(dá)式庫regex的控制臺(tái)應(yīng)用程序,設(shè)定好包含目錄和庫目錄后,發(fā)現(xiàn)最后鏈接失敗,提示:LINK : fatal
error LNK1104:
無法打開文件“libboost_regex-vc80-mt-gd-1_34_1.lib”。使用boost庫不需要在工程設(shè)置中顯式的指定庫名字,而
是由boost自身來完成這個(gè)設(shè)定的。由于boost庫跨平臺(tái)并且支持多個(gè)編譯環(huán)境,因此這個(gè)被鏈接庫文件的文件名是根據(jù)當(dāng)前編譯的配置動(dòng)態(tài)生成的。
boost_regex是庫的基本名稱,vc80是編譯環(huán)境,mt表示這是一個(gè)多線程庫,gd表示包含調(diào)試信息,最后的1_34_1是版本號(hào)。檢查安裝后
的庫文件,發(fā)現(xiàn)有的是boost_regex-vc80-mt-gd-1_34_1.lib,所以很明顯,在庫名生成的過程中出現(xiàn)了問題,多了一個(gè)
“lib”前綴。 打開boost/regex.hpp,繼續(xù)打開boost/regex/config.hpp文件,最終可以發(fā)現(xiàn)動(dòng)態(tài)鏈接配置的功能是由boost
/config/auto_link.hpp統(tǒng)一實(shí)現(xiàn)的。在這個(gè)文件開頭的注釋里詳細(xì)說明了使用方式,相信這種方式對(duì)我們自己的庫開發(fā)也很有裨益。這里提
到了名稱的構(gòu)造公式: BOOST_LIB_PREFIX+ BOOST_LIB_NAME
 + "_"
 + BOOST_LIB_TOOLSET
 + BOOST_LIB_THREAD_OPT
 + BOOST_LIB_RT_OPT
 "-"
 + BOOST_LIB_VERSION
 根據(jù)我們的錯(cuò)誤,我們應(yīng)該檢查BOOST_LIB_PREFIX的值為什么是“lib”而不是空的。通過搜索,發(fā)現(xiàn) #if (defined(_DLL) || defined(_RTLDLL)) && defined(BOOST_DYN_LINK)#? define BOOST_LIB_PREFIX
 #elif defined(BOOST_DYN_LINK)
 #? error "Mixing a dll boost library with a static runtime is a really bad idea..."
 #else
 #? define BOOST_LIB_PREFIX "lib"
 #endif
 現(xiàn)在終于清楚了,我們應(yīng)該在工程設(shè)置中加入_DLL定義或者_(dá)RTLDLL定義,并且指定boost庫采用動(dòng)態(tài)連接,定義BOOST_DYN_LINK。在工程設(shè)置中加入_DLL;BOOST_DYN_LINK,鏈接就通過了。 方法五: 這幾天寫代碼需要序列化自定義類,類的定義可以抽象為vector<vector<T>
>。我本想通過重載operator<<和operator>>
來實(shí)現(xiàn)序列化。但是寫入是寫入了,讀就讀不出來了。在讀完第一個(gè)對(duì)象之后istream的tellg()返回了-1,導(dǎo)致后續(xù)的對(duì)象無法讀取。后來我使用
boost很方便的就完成了序列化的工作。但是我使用的編譯環(huán)境是VC9,boost還沒有針對(duì)vc9的編譯設(shè)置,所以編譯安裝還是花了點(diǎn)時(shí)間。 針對(duì)VC9,下載的boost需做如下修改:(+為需增加的行,) 文件 msvc.jam @@ -231,6 +231,10 @@ local rule configure-really ({
 # Even if version is not explicitly specified, try to detect the version
 # from the path.
 +            if [ MATCH "(Microsoft Visual Studio 9.0)" : $(command) ]
 +            {
 +                version = 9.0 ;
 +            }
 if [ MATCH "(Microsoft Visual Studio 8)" : $(command) ]
 {
 version = 8.0 ;
 @@ -913,13 +916,14 @@ actions compile.mc
  .ProgramFiles = [ path.make [ common.get-program-files-dir ] ] ; -.known-versions = 8.0 8.0express 7.1 7.1toolkit 7.0 6.0 ;+.known-versions = 9.0 9.0express 8.0 8.0express 7.1 7.1toolkit 7.0 6.0 ;
  # Version aliases.version-alias-6 = 6.0 ;
 .version-alias-6.5 = 6.0 ;
 .version-alias-7 = 7.0 ;
 .version-alias-8 = 8.0 ;
 +.version-alias-9 = 9.0 ;
  # Name of the registry key that contains Visual C++ installation path#   (relative to "HKEY_LOCAL_MACHINE\SOFTWARE\\Microsoft"
 @@ -928,6 +932,8 @@ actions compile.mc
 .version-7.1-reg = "VisualStudio\\7.1\\Setup\\VC" ;
 .version-8.0-reg = "VisualStudio\\8.0\\Setup\\VC" ;
 .version-8.0express-reg = "VCExpress\\8.0\\Setup\\VC" ;
 +.version-9.0-reg = "VisualStudio\\9.0\\Setup\\VC" ;
 +.version-9.0express-reg = "VCExpress\\9.0\\Setup\\VC" ;
  # Visual C++ Toolkit 2003 do not store its installation path in the registry.# The environment variable 'VCToolkitInstallDir' and the default installation
 文件 auto_link.hpp  line133開始改成: #elif defined(BOOST_MSVC) && (BOOST_MSVC == 1400) 
 // vc80:
 #  define BOOST_LIB_TOOLSET "vc80"
 
 #elif defined(BOOST_MSVC) && (BOOST_MSVC >= 1500)
 
 // vc90:
 #  define BOOST_LIB_TOOLSET "vc90"
 #elif defined(__BORLANDC__) 文件 visualc.hpp #error "Compiler not supported or configured - please reconfigure"#endif
 //
 -// last known and checked version is 1400 (VC8):
 -#if (_MSC_VER > 1400)
 +// last known and checked version is 1500 (VC9):
 +#if (_MSC_VER > 1500)
 #  if defined(BOOST_ASSERT_CONFIG)
 #     error "Unknown compiler version - please run the configure tests and report the results"
 #  else
 然后就可以編譯了,但是在編譯過程中會(huì)有很多的warning C4819: The file contains a
character that cannot be represented in the current code page (936).
原因是boost源代碼的注釋中有很多非low
ASCII的字符,都是人名和版權(quán)注釋。在編譯boost庫時(shí)可以不管,但是在編譯包含了boost的頭文件的項(xiàng)目時(shí)卻很煩人??梢栽趐roject
properties,   C/C++,    Advanced,   Disable Specific
warnings中填入4819關(guān)閉這個(gè)警告。
 VS2005中     error       LNK2019:       無法解析的外部符號(hào)       _WinMain@16       ,該符號(hào)在函數(shù)       _WinMainCRTStartup       中被引用。 本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/huangjack_1/archive/2008/10/14/3073575.aspx boost庫使用了一種自動(dòng)鏈接技術(shù),通過分析編譯器設(shè)定的工程選項(xiàng)自動(dòng)選擇庫進(jìn)行鏈接。例如: 新建一個(gè)VC工程,右擊項(xiàng)目,選擇屬性->配置屬性->C/C++->代碼生成->運(yùn)行時(shí)庫。如果選擇非動(dòng)態(tài)鏈接庫(MT,
MTD),boost自動(dòng)鏈接對(duì)應(yīng)的靜態(tài)庫,否則(MD, MDD)會(huì)鏈接動(dòng)態(tài)庫,用戶在在鏈接選項(xiàng)中手動(dòng)設(shè)置的boost庫被忽略。
 具體鏈接的庫名也是有boost\config\auto_link.hpp中的預(yù)編譯宏自動(dòng)生成,如果發(fā)現(xiàn)boost鏈接了不正確的庫,應(yīng)該仔細(xì)分析該文件。
 總之,配置boost項(xiàng)目的庫鏈接不是通過配置鏈接器,而是通過編譯器的預(yù)編譯選項(xiàng)和預(yù)編譯宏實(shí)現(xiàn)的。
 再舉一個(gè)例子:使用VC編譯boost相關(guān)工程常見的一個(gè)錯(cuò)誤是,選擇MDD庫編譯時(shí),報(bào)找不到boost庫的錯(cuò)誤,分析auto_link.hpp可知,在MDD選項(xiàng)打開時(shí),預(yù)編譯宏_DLL被設(shè)置,在auto_link.hpp的294行有如下代碼:
 #if ((defined(_DLL) || defined(_RTDLL))) && defined(BOOST_DYN_LINK)
 #define BOOST_LIB_PREFIX
 #elif defined(BOOST_DYN_LINK)
 #error "Mixing a dll boost library with a static runtime is a really bad idea..."
 #else
 #define BOOST_LIB_PREFIX "lib"
 #endif
 由于BOOST_DYN_LINK未設(shè)置,導(dǎo)致庫名前綴宏BOOST_LIB_PREFIX被定義為"lib",而boost動(dòng)態(tài)鏈接庫的庫名默認(rèn)是沒有l(wèi)ib前綴的,如是會(huì)導(dǎo)致上述鏈接錯(cuò)誤。只要在編譯器預(yù)編譯頭中定義宏BOOST_DYN_LINK即可解決該問題
 一個(gè)link errorerror LNK2001: unresolved external symbol __imp___assert
 You may be using /MTd (Debug Multithreaded), which could explain this link error.
 When
you build and link your static library, I recommend you use /MDd
[debug] or /MD [release], which means use the DLL runtime libraries.
 關(guān)于STLport首先應(yīng)該定義:
 #define __STL_DEBUG
 但由于用了STLport,會(huì)鏈接
boost_regex-vc80-mt-gdp-1_41.lib(不用STLport時(shí)是boost_regex-vc80-mt-gd-
1_41.lib)。boost_regex-vc80-mt-gdp-1_41.lib在boost的lib目錄下沒有,如果非得使用STLport,
可以想到的有兩種辦法:
 1)將boost的lib目錄下的boost_regex-vc80-mt-gd-1_41的lib和dll復(fù)制一份出來改成boost_regex-vc80-mt-gdp-1_41的lib和dll。這種方法又會(huì)引入很多新的link error
 2)將STLport下的stlportd.5.1的lib和dll拷貝出來,放入當(dāng)前工程目錄下,程序聲明中加上:
 #pragma comment(lib, "stlportd.5.1.lib")
 由于boost庫默認(rèn)是靜態(tài)鏈接的,因此要加入聲明:#define BOOST_ALL_DYN_LINK
 #define BOOST_LIB_DIAGNOSTIC
 一個(gè)測(cè)試程序:#define BOOST_ALL_DYN_LINK
 #define BOOST_LIB_DIAGNOSTIC
 #define __STL_DEBUG
 #pragma comment(lib, "stlportd.5.1.lib")
 #include <cstdlib>#include <stdlib.h>
 #include <boost/regex.hpp>
 #include <string>
 #include <iostream>
 using namespace boost;using namespace std;
 regex expression("^select ([a-zA-Z]*) from ([a-zA-Z]*)"); int main(int argc, char* argv[]){std::string in;
 cmatch what;
 cout << "enter test string in the from of select aaa from bbb:" << endl;
 getline(cin,in);
 if(regex_match(in.c_str(), what, expression)){
 for(int i=0;i<what.size();i++)
 cout<<"str :"<<what[i].str()<<endl;
 }
 else{
 cout<<"Error Input"<<endl;
 }
 return 0;
 }
   本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/sptoor/archive/2009/12/03/4933863.aspx(#) 
 |