最近寫個(gè)東西要用到正則表達(dá)式,于是就想到了Boost庫(kù),由于以前沒(méi)有用過(guò)這個(gè)庫(kù),所以今天為這事兒真是費(fèi)了一番功夫。
一開(kāi)始想到的是Boost,但是突然想起VC++ 2008的SP1不是已經(jīng)帶了tr1的實(shí)現(xiàn)嗎,貌似直接用就行了。但是事與愿違,我這里裝的是VC++ 2008 Express,雖然也能#include <regex>,但是寫出來(lái)的程序只能編譯不能鏈接。后來(lái)一查才知道微軟的tr1實(shí)現(xiàn)是不支持Express的(雖然不支持卻又把頭文件放在那里誆人),莫非又要去別個(gè)VC完整版那里拷點(diǎn)東西出來(lái)不成?這應(yīng)該是沒(méi)必要的,因?yàn)閺腣C++ 2003開(kāi)始Boost就可以很好的在VC下編譯了,所以干脆不管那個(gè)啥tr1了,準(zhǔn)備直接從Boost官方網(wǎng)站
下載Boost再自己編譯。
我下載的是最小的那個(gè)7z的包,解壓縮到D:\Boost,然后就可以開(kāi)始編譯了。壓縮包里面帶有Boost的幫助文檔,打開(kāi)intex.html可以看到。在Getting Started一節(jié)里面有詳細(xì)的自助編譯教程。
Boost可以完整編譯也可以針對(duì)單獨(dú)的模塊編譯。網(wǎng)上很多人說(shuō)完整編譯一下要五六個(gè)小時(shí),所以很多人都不推薦完整編譯,而是用到什么再編譯什么,比如可以這樣子單獨(dú)編譯正則表達(dá)式庫(kù):
- 從開(kāi)始菜單打開(kāi)VC++的命令行工具,瀏覽到D:\Boost\libs\regex\build
- 輸入nmake /f vc9.mak開(kāi)始編譯,幾分鐘內(nèi)可以完成
- 輸入nmake /f vc9.mak install把編譯出來(lái)的lib和dll等安裝到VC安裝目錄的lib目錄下
- 輸入nmake /f vc9.mak clean把臨時(shí)文件刪除
要在VC++工程里面,要#include "D:/Boost/boost/regex.hpp",然后才能使用正則表達(dá)式庫(kù)(不需要在鏈接器手工指定鏈接到哪個(gè)lib)。
但是這里會(huì)出現(xiàn)Boost的一個(gè)小小的bug,它的版本雖然已經(jīng)是1.39了,但是編譯出來(lái)的東西卻都還是xxx1_38.xx這樣子,這會(huì)導(dǎo)致鏈接器找不到需要的lib。于是那些xxx1_38.xx的文件名都要把1_38改成1_39才行。改了之后程序就能正常的編譯和鏈接了。徹底的解決辦法是用文本編輯器打開(kāi)vc9.mak,把所有的1_38字符串都替換為1_39,然后再nmake和install。
在單獨(dú)編譯了一個(gè)包之后,我很快就不滿足這種一個(gè)一個(gè)編譯的方式了,我打算嘗試完整編譯。試驗(yàn)的結(jié)果是,編譯時(shí)間根本就不需要網(wǎng)上說(shuō)的五六小時(shí)那么長(zhǎng),在我的一臺(tái)E7200的機(jī)器上面,完整編譯只花了不到一個(gè)小時(shí)。而如果只編譯靜態(tài)庫(kù)的話,時(shí)間還要少一半多。所以這事兒沒(méi)那么可怕。唯一的小問(wèn)題是完整編譯出來(lái)的東西居然占了接近3G的硬盤空間,還好用NTFS的壓縮文件夾功能,可以壓縮到不到1G,這樣就不算大了。
完整編譯的方法也很簡(jiǎn)單:
- 到Boost官方網(wǎng)站下載一個(gè)最新的bjam.exe,這是用來(lái)編譯Boost的工具,把它放到D:\Boost目錄
- 從開(kāi)始菜單打開(kāi)VC++的命令行工具,瀏覽到D:\Boost
- 輸入bjam --without-python toolset=msvc --build-type=complete開(kāi)始編譯(--build-type也可以不要,這樣只編譯靜態(tài)庫(kù),既省時(shí)間又省硬盤空間)
- 添加VC++的include目錄到D:\Boost,添加lib目錄到D:\Boost\stage\lib
這樣就可以在VC++工程里面直接#include <boost/regex.hpp>這樣使用正則表達(dá)式庫(kù)了。完整編譯出來(lái)的dll和lib等沒(méi)有上面說(shuō)的那個(gè)1_38命名問(wèn)題,而且編譯出來(lái)的所有文件都集中的放在了一起,所以完整編譯顯然是更科學(xué)的做法。
BTW,用Windows SDK的命令行工具也可以編譯,如果沒(méi)裝VC的話。