BoostのregexをVC2005expressでつかう。
Windows.hやuser32.libがあってこれらを使ったコンパイルが通ることが前提。
1.47を使う。最新の1.49ではなんかおかしかったのでパスした。
展開したら、コマンドプロンプトを開き。まずVC2005のvcvarsallを実行する。
1 |
> C:\Program Files\Microsoft Visual Studio 8\VC\vcvarsall.bat |
次に展開したboostの下の、C:\aaa\boost_1_47_0\libs\regex\buildに行く。
1 |
> cd C:\aaa\boost_1_47_0\libs\regex\build |
nmakeする。
1 |
> nmake -fvc8.mak |
環境変数INCLUDEやLIBが正しく設定されてないとエラーが出るので、以下のような感じで直す。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
>echo %INCLUDE% C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE; >set INCLUDE=L:MSSDK\2003\Include;%INCLUDE% >echo %INCLUDE% L:MSSDK\2003\Include;C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE; >echo %LIB% C:\Program Files\Microsoft Visual Studio 8\VC\LIB;C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\lib; >set LIB=L:\MSSDK\2003\Lib;%LIB% >echo %LIB% L:\MSSDK\2003\Lib;C:\Program Files\Microsoft Visual Studio 8\VC\LIB;C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\lib; |
メイクが成功すると、vc8フォルダに*.libファイルがたくさんできる。
ファイル名の意味は以下のようになる。
先頭に “lib” がついてるのはスタティックライブラリ。大きい
‘s’ はランタイムへのスタティックリンクをしているもの。
‘d’ はデバッグビルドしたもの。
‘g’ はデバッグランタイムでビルドしたもの。
‘mt’ はマルチスレッドだが、これからはこれが標準(以下参照)
以下のコマンドを実行すれば、標準のLIBパスにコピーしようとするがここではやらない。
1 |
> nmake -fvc8.mak install |
ここでできた*.libを適当な場所にコピーして、vc2005の「追加のライブラリパス」に追加する。
ただしメイクの際に/MLdを無視しますみたいなwarningが出てたのでシングルスレッドのは意味がないかもしれない。
これであとは、boostのソースコード(おそらく
config/auto_link.hpp)がコンパイル時に適切なlibを探してリンク(#pragma comment lib)してくれる。
以下はboostのサイトにあったソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include "stdafx.h" #include <boost/regex.hpp> #include <iostream> #include <string> int main() { std::string line; boost::regex pat( "^Subject: (Re: |Aw: )*(.*)" ); while (std::cin) { std::getline(std::cin, line); boost::smatch matches; if (boost::regex_match(line, matches, pat)) std::cout << matches[2] << std::endl; } } |
ワイド化してもコンパイルできる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include "stdafx.h" #include <boost/regex.hpp> #include <iostream> #include <string> int main() { std::wstring line; boost::wregex pat( L"^Subject: (Re: |Aw: )*(.*)" ); while (std::wcin) { std::getline(std::wcin, line); boost::wsmatch matches; if (boost::regex_match(line, matches, pat)) std::wcout << matches[2] << std::endl; } } |