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/install:stage表示只生成庫(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/prefix:stage時使用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"中.
最後測試一下是否安裝成功:
#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 cout<<"str :"< }
else
{
cout<<"Error Input"< }
return 0;
}輸入: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");
}
輸出的結果跟上面一樣。