Boost在VS2008下的正確編譯

Boost在VS2008下的正確編譯

http://beyrens.blog.163.com/blog/static/95894452201052912424648/

首先下載Boost_1_34_1.zip和Boost-jam-3.1.15.zip前一個是boost主文件包,後一個是編譯Boost庫用的JAME工具.

bjam stage --toolset=msvc-9.0 --without-python --without-mpi --without-wave --without-graph --without-math --without-serialization --stagedir="E:/SDK/boost_1_39_0/bin/vc9" link=static runtime-link=shared threading=multi debug release

stage/installstage表示只生成庫(dll和lib),install還會生成包含頭文件的include目錄。本人推薦使用stage,因爲install生成的這個include目錄實際就是boost安裝包解壓縮後的boost目錄(E:/SDK/boost_1_39_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/prefixstage時使用stagedir,install時使用prefix,表示編譯生成文件的路徑。推薦給不同的IDE指定不同的目錄,如VS2008對應的是E:/SDK/boost_1_39_0/bin/vc9,VC6對應的是E:/SDK/boost_1_39_0/bin/vc6,否則都生成到一個目錄下面,難以管理。如果使用了install參數,那麼還將生成頭文件目錄,vc9對應的就是E:/SDK/boost_1_39_0/bin/vc9/include/boost-1_39/boost,vc6類似(光這路徑都這樣累贅,還是使用stage好)。

build-dir編譯生成的中間文件的路徑。這個本人這裏沒用到,默認就在根目錄(E:/SDK /boost_1_39_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版本,所以兩個都編譯。

本人按以上方式分別編譯了靜態鏈接和動態鏈接兩個版本後,整個E:/SDK/boost_1_39_0目錄(包括安裝包解壓縮文件和編譯生成的庫文件)只有不到500MB。事實上編譯完成後安裝包解壓縮文件除了boost目錄之外其他目錄和文件已經可以刪除了,這樣還可以騰出150MB的空間來。不過我又研究了一下,其實libs這個目錄也很有用,它提供了所有Boost類的使用範例,平時可以作爲參考;另外doc目錄是一個完整的boost 使用幫助文檔,當然最好也不要刪了。這樣剩下的幾個目錄和文件加起來也就十多兆,索性都給它們留一條生路吧。

呵呵,一個完整而又完美的boost目錄就此誕生了。

如果圖省事,不想了解這麼多,那麼有簡單的方法,可以使用命令:

bjam --toolset=msvc-9.0 --build-type=complete

直接指定編譯器以完全模式編譯即可,這樣可以滿足今後的一切使用場合,但同時帶來的後果是:

1、佔用3G以上的硬盤空間
2、佔用若干小時的編譯時間
3、頭文件和庫文件存放於C:/Boost(個人非常反感)

4、生成的很多文件可以永遠也用不上

首先下載Boost_1_34_1.zip和Boost-jam-3.1.15.zip前一個是boost主文件包,後一個是編譯Boost庫用的JAME工具.
現定義 %BOOST% 爲Boost_1_34_1.zip的解壓路徑,%BOOST_BJAM%爲Boost-jam-3.1.15.zip的解壓路徑.
打開%BOOST_BJAM%/Build.bat,修改其中的編譯器路徑.如:

if EXIST "%ProgramFiles%/Microsoft Visual Studio 8/VC/bin/VCVARS32.BAT" (
   set "BOOST_JAM_TOOLSET=vc8"
   set "BOOST_JAM_TOOLSET_ROOT=%ProgramFiles%/Microsoft Visual Studio 8/VC/bin/VCVARS32.BAT"
   goto :eof)
setlocal & endlocal

修改爲(VS2005):

if EXIST "D:/Program Files/Microsoft Visual Studio 8/VC/bin/VCVARS32.BAT" (
   set "BOOST_JAM_TOOLSET=vc8"
   set "BOOST_JAM_TOOLSET_ROOT=D:/Program Files//Microsoft Visual Studio 8/VC/bin/VCVARS32.BAT"
   goto :eof)
setlocal & endlocal

或者(VS98):

if EXIST "C:/Program Files//Microsoft Visual Studio/VC/bin/VCVARS32.BAT" (
   set "BOOST_JAM_TOOLSET=vc8"
   set "BOOST_JAM_TOOLSET_ROOT=C:/Program Files//Microsoft Visual Studio/VC/bin/VCVARS32.BAT"
   goto :eof)
setlocal & endlocal

保存後執行build.bat.完成後會在%BOOST_BJAM%/bin.ntx86目錄下面生成一個bjam.exe的文件,一會用它來編譯生成boost的庫文件.
把bjam.exe拷貝到%BOOST%目錄下,並新建一個Build.bat文件.編輯Build.bat
call "D:/Program Files/Microsoft Visual Studio 8/VC/bin/vcvars32.bat"
bjam -sBOOST_ROOT=. -sTOOLS=vc-8_0  --build-dir=. --with-regex --toolset=msvc stage

這樣可以在%BOOST%/stage/lib目錄下生成所需的庫文件.我的感覺是添加"--with"參數,一個庫一個庫的編譯(也許可以同時添加多個庫我沒有試)會快點.一般用不到Python、test、thread(Boost的thread庫對Windows平臺的支持並不好,因爲他是基於Posix線程的),而最佔時間的應該是Python庫了.
需要編譯的Boost庫一共有12個,都是與平臺相關的庫.分別爲:

Date_time
Test
Python
Filesystem
Thread
Wave
Program_options
Regex
Serialization
Signals
Graph
Iostreams

編譯好之後,就可以在VS2005的"工具"-->"選項",選擇"項目和解決方案"-->"vc++ 目錄"中將%BOOST%/lib和%BOOST%/stage/lib添加"庫文件"中,將"%BOOST%"添加到"包含文件"中.
在VC98中,選擇"Tools” ->"Options” ->"Diretories” ->"Show Diretories for”,同樣將以上文件夾分別添加到"Include Files"和 "Library Files"中.

最後測試一下是否安裝成功:

clip_image001#include "stdafx.h"
clip_image001[1]#include
clip_image001[2]#include
clip_image001[3]#include
clip_image001[4]#include
clip_image001[5]#include
clip_image001[6]using namespace std;
clip_image001[7]using namespace boost;
clip_image001[8]regex expression("^select ([a-zA-Z]*) from ([a-zA-Z]*);");
clip_image001[9]int main(int argc, char* argv[])
clip_image002{
clip_image003     std::string in;
clip_image003[1]     cmatch what;
clip_image003[2]     cout << "enter test string" << endl;
clip_image003[3]     getline(cin,in);
clip_image003[4]     if(regex_match(in.c_str(), what, expression))
clip_image004     {
clip_image003[5]           for(int i=0;iclip_image003[6]           cout<<"str :"<clip_image005     }
clip_image003[7]     else
clip_image004[1]     {
clip_image003[8]        cout<<"Error Input"<clip_image005[1]     }
clip_image003[9]        return 0;
clip_image006}輸入:select name from database;
輸出:str:select name from table;
str:name
str:table
這樣就完成了.

1. Boost的安裝

首先,從Boost庫的官方網站 進行Boost的下載,最新的版本可能是1.39.0,不過我使用的1.36版本。下載完成並解壓,就可以了。解壓後的空間可能會很大。所以請預先留足空間。編譯之後會用更多的空間。

2. Boost的編譯

編譯的過程很漫長,而且會佔用相當大的磁盤空間。

(1)運行tools/jam/src/build.bat。

(2)將bin.ntx86文件夾下的bjam文件夾拷貝至Boost安裝根目錄。

(3)完整編譯命令如下

bjam toolset=msvc threading=multi variant=debug release stage

其中toolset指的是編譯器,msvc就表示微軟的VS編譯器;threading是表示單線程或者多線程,一般都爲多線程;variant是一些參數,debug release表示既編譯出debug版本,又編譯出release版本,stage表示編譯出來的文件都放在stage目錄下。

以上是完全編譯,如果不想完全編譯的話,可以用--without指定不想編譯的庫,例如--without -wave等等。

3. Boost庫的使用

(1)打開VS,單擊VC配置,工具,選項,VC++目錄。

在包含文件那一項,添加Boost的根目錄;在庫文件那一項,添加剛剛編譯出來的庫所在的目錄(stage)。

這樣就完成。

(2)寫個測試程序。當上述程序編譯通過,並可以正常運行,表示Boost庫的安裝已經成功。

view plaincopy to clipboardprint?

1. #include

2. #include

3. #include

4. int main()  

5. {  

6.     boost::asio::io_service io;  

7.     boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));  

8.     t.wait();  

9.     std::cout << "Hello, world!/n";  

10. return 0;  

11. } 

#include #include #include int main() { boost::asio::io_service io; boost::asio::deadline_timer t(io, boost::posix_time::seconds(5)); t.wait(); std::cout << "Hello, world!/n"; return 0; }

1)下載boost

http://www.boost.org/users/download/

這是它的下載頁面,需要下載2個東西:

Packaged Releases

VERSION 1.35.0

Boost Jam 3.1.16

你需要在每個條目下面找到Details | Download字樣,點擊Download,進入下載頁。可是遺憾的是sourceforge站點被封了,所以通常你是無法下載的。(我詛咒封這個站點的人)。因此有必要使用某些特殊的工具來穿透這個封鎖。我下載的是這個:

boost_1_35_0.tar.gz

boost-jam-3.1.16.zip

2)下載Python2.5.2

http://www.python.org/download/

在這個頁面點擊Python2.5.2 Windows Installer

得到一個Python2.5.2.msi後,即可點擊安裝。我安裝在C:OpenSourcePython25

創建一個批處理文件:pt.bat,內容如下:

set path=C:OpenSourcePython25
Python

然後啓用命令行工具(運行cmd.exe),進入pt.bat所在目錄,鍵入pt.bat

如果你看到>>>的提示符號,說明python安裝成功。

3)編譯boost-jam

解壓boost_1_35_0.tar.gz,到目錄boost_1_35_0。我的是在C:OpenSource boost_1_35_0。這樣你在C:OpenSource boost_1_35_0下就能發現boost-build.jam這個文件。

解壓boost-jam-3.1.16.zip,然後在目錄下雙擊build.bat,即進行編譯。編譯結束,可以發現生成了bin.ntx86bjam.exe。

我們要的就是這個bjam.exe,把它複製到boost_1_35_0目錄下,在這個目錄下有boost-build.jam文件。

4)完全編譯boost_1_35_0

編譯全部庫。雖然你可以只編譯一部分,但是還是全部編譯,省的以後麻煩。爲此你需要編寫一個批處理文件,我命名它爲boost.bat:

SET MSVC_ROOT="F:Microsoft Visual Studio 8VC"
SET VISUALC="F:Microsoft Visual Studio 8VC"
SET JAM_TOOLSET=VISUALC
SET PYTHON_ROOT=C:OpenSourcePython25
SET PYTHON_VERSION=2.5.2
SET PATH=C:OpenSourceboost_1_35_0

你要保證你的路徑是正確設置的。然後把這個文件保存到C:OpenSource下面。(其實位置不重要)。然後啓用命令行工具(cmd)。類似地輸入下面的命令(表示回車):

C:OpenSource>boost.bat
C:OpenSource>cd boost_1_35_0
C:OpenSourceboost_1_35_0>bjam -sBOOST_ROOT=. -sTOOLS=msvc

然後你就等待吧。一大堆的警告是不要管的。估計等1小時不到的時間,就完全編譯好了。你可以發現在C盤出現了:

C:Boost

它下面有Include和Lib目錄。你可以使用這個C:Boost,使用它的靜態或動態庫。也可以使用C:OpenSourceboost_1_35_0下的源代碼。

5)結束也是開始BOOST之旅

好了,開始你的boost之旅吧。我用它的graph庫實現了最短路徑,整個上海的路網,4萬多條路段,任意2點查詢最短路徑,不超過3秒就OK。內存消耗在30M左右。從此我喜歡上了boost。

最新的BOOST提供了C++和Python的接口,這也是我要用它的理由。一個簡單的比喻,C++好比COM,Python好比JavaScript,如果你認爲JavaScript調用COM可以產生強大的威力,是原子彈的話,那麼Python調用C++則是氫彈。關於Boost.Python的知識,參考:

http://www.cppblog.com/jinq0123/archive/2008/05/29/BuildingHybridSystemswithBoostPython_c.html

當然,我還是覺得上述過程太複雜,在Windows上使用Boost,你可以完全忽略上面的過程,到下面這個鏈接裏直接取得一個下載軟件,它會給你下載你要的包:

http://www.boostpro.com/products/free

最近做開發碰到了長字符串匹配、搜索的問題,最先想到的是使用正則表達式,簡單、高效。

但是我用的開發工具是VC6.0,不支持正則表達式。

上網baidu一下,發現支持正則的庫還真不少,大概有以下幾種:boost,GNU,VC7帶的ATL中的和微軟發佈的greta。

網上的朋友對boost評價不錯,決定就使用是它了!

1、接下來的就是下載boost庫,網上很好找。我下載的是壓縮包,20多M,解壓後將近100多M。

我解壓的目錄是D:/boost

2、然後是編譯,我只要支持正則表達式就可以,因此只需要編譯D:/boost/libs egex/build目錄下的文件。據說全部編譯要花將近2個小時,沒有驗證過,在我家裏的機器上編譯正則表達式部分只用了不到5分鐘。

網上介紹的如何編譯最多的一篇文章是“VC利用boost庫解析正則表達式”,如果有人能根據這篇文章編譯成功不妨告訴小弟一聲……

以下是我的操作:

在“運行”裏輸入“cmd”,打開命令提示符;

輸入命令“cd D:/boost/libs egex/build”//設置當前目錄

輸入命令“D:”//轉到當前目錄

接下來是很關鍵的一步:

很多文章是這樣說的“輸入 nmake -fvc6.mak”

但是出現了“'nmake' 不是內部或外部命令,也不是可運行的程序或批處理文件。”的錯誤提示。

然後你就會拼命查找原因,結果又有文章上說是環境變量沒配置好,然後給出一堆“set”。

也有的文章說是運行一下visual studio安裝目錄下的VC98/Bin/VCVARS32.BAT文件就OK了。

你按照文章作者的方法做的,結果發現問題依舊!

以上說法都是正確的,但是說得都不是很完整,出現錯誤提示的根本原因就是環境變量沒配置好,不識別nmake命令,配置過jdk的朋友就很容易明白。如果按照作者的要求搞一堆“set”,未免大題小作了吧,因爲我們只需要用一次'nmake' 就可以解決問題了。

VCVARS32.BAT正式配置環境變量的批處理文件,但是配置的參數只在當前窗口有效,也就是說當你雙擊運行後窗口關閉,環境變量已經沒有了。

於是我用了以下方法:

把VCVARS32.BAT文件用鼠標拖到打開的cmd窗口("D:/Program Files/Microsoft Visual Studio/VC98/Bin/VCVARS32.BAT"),然後回車。

輸入命令“nmake -fvc6.mak”

等待幾分鐘,OK了!,D:/boost/libs egex/build多了一個vc6的文件夾,裏面是很多lib和dll文件。

3、到此資源已經準備好了,下面要做的工作是配置VC6.0,使它編譯使時候能找到正則庫。

把vc6下的所有lib和dll文件拷貝到Visual Studio安裝目錄下的VC98/boostRex(boostRex是我自己建的)

然後打開vc6.0,選擇“Tools->Options->Directories->Include files”,加入一行“D:/BOOST”

選擇“Tools->Options->Directories->Library file”,加入一行“C:/PROGRAM FILES/MICROSOFT VISUAL STUDIO/VC98/BOOSTREX”(彩色部分是我的Visual Studio安裝目錄)

配置也OK了!

4、編寫程序測試

SDK下的測試:

#include "stdafx.h"

#include

#include

#include

#include

#include

using namespace std;

using namespace boost;

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" << endl;

getline(cin,in);

if(regex_match(in.c_str(), what, expression))

{

for(int i=0;i< p>

cout<<"str :"<<< p>

}

else

{

cout<<"Error Input"<< p>

}

return 0;

}

輸入: select name from table

輸出: str:select name from table

str:name

str:table

MFC下的測試(有幾個地方要注意,下面有提示):

新建一個對話框的MFC工程,

加入頭文件

#include

在按鈕鼠標單擊事件響應函數中加入

boost::regex expression("^select ([a-zA-Z]*) from ([a-zA-Z]*)");

CString in = "select gm from tab";

CString sRet;

boost::cmatch what;

if(boost::regex_match(LPCSTR(in), what, expression))//CString轉string

{

for(int i=0;i< p>

sRet = (what.str()).c_str();//string轉CString

MessageBox(sRet);

}

}

else

{

MessageBox("Error Input");

}

輸出的結果跟上面一樣。

發佈了60 篇原創文章 · 獲贊 7 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章