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