2005年10月26日 水曜日

Visual C++ ToolkitでSTLPortとBoostを使えるようにする

まず最初に、お手軽にBoost+STLPortを使うなら、断然Debianでapt-getすることをお勧めします。apt-getさえしたら自動的に使えるようになります。それにもかかわらずVC++2003 Toolkitをインストールしてみた理由は、_VC++2003の方がC++98の準拠度が高そう_という単純な理由だったりする。Boostのサンプルプログラムを何個かgcc4でコンパイルしてみたのだけど、コンパイルできない物があったので、リファレンスとしてもう一つコンパイラが欲しくなったというわけだ。
そんなわけで、役立つかどうか知らないけどインストールのメモ。基本的にドキュメント通りインストールすればいいのだが… いろいろ落とし穴はある。

準備する物

楽しく遊ぶにはまず道具から。
Microsoft.NET Framework Ver 1.1 Residtributable Package
そもそもVC++ Toolkitをインストールために必要。日本語化のパッケージも入れておくと良いかも。
Microsoft.NET Framework SDK Ver 1.1
何個かのコマンドとスタティックライブラリが必要(msvcrt.libとか)
Visual C++ Toolkit 2003
これがないとはじまらない。
Microsoft Windows Server 2003 SP1 PlathomeSDK
なんとnmakeはこれにだけ付属している。あとWindowsSDKのヘッダが必要なときはこれがいる。
STLPort
STL自身は入れ替えなくても良さそうな気がするけど、GCCの環境に合わせることにする。日記執筆時の最新は2.6.2。
Boost
今日のメインディッシュ。Boost本体とbjamをダウンロードしておく。

下準備

インストールは.NET Framework関連 → .NET SDK → Plathome SDKの順番でインストール。特に説明すべきことはない。インストーラーでデフォルトのままでインストール後、コマンドライン・コンパイル環境を設定するためのVC++Toolkitについているvcvars32.bat(C:\Program Files\Microsoft Visual C++ Toolkit 2003にある)に環境変数を書き足す。以下のディレクトリをフルパス名で指定。デフォルトでインストールすれば以下のような物となるだろう。

環境変数 PATH

  • c:\Program Files\Microsoft Visual C++ ToolKit 2003\bin
  • c:\Program Files\Microsoft Plathome SDK\bin
  • c:\Program Files\Microsoft Plathome SDK\bin\WinNT
  • c:\Program Files\Microsoft.NET\SDK\v1.1\bin
  • c:\windows\Microsoft.NET\Framework\v1.1.4322

環境変数 INCLUDE

  • c:\Program Files\Microsoft Visual C++ ToolKit 2003\include
  • c:\Program Files\Microsoft Plathome SDK\include
  • c:\Program Files\Microsoft Visual Studio.NET 2003\Vc7\include
  • c:\Program Files\Microsoft.NET\SDK\v1.1\include

環境変数 LIB

  • c:\Program Files\Microsoft Visual C++ ToolKit 2003\lib
  • c:\Program Files\Microsoft Plathome SDK\lib
  • c:\Program Files\Microsoft Visual Studio.NET 2003\Vc7\lib
  • c:\Program Files\Microsoft.NET\SDK\v1.1\lib
    .net SDKに付属するVC++2003関連のディレクトリにパスを通すのを忘れると何個かのスタティックライブラリがリンクできないので注意。(まぁ気が付くと思うけれども。) ここまでインストールして足りない物はlib.exeですが、linkコマンドに/LIBスイッチを指定すれば同じ動作をするので、Makefileを書き直せばよろしい。あと足りないライブラリはmsvcprt.libとmsvcprtd.lib(標準C++ライブラリっぽい)。これはlinkのオプションで/nodefaultlibで読みにいかないように指定する。

STLPortのインストール

基本的にドキュメント通り。

  1. src\vc_common.makを書き換える。書き換えは先に説明したことであるが、LDFLAGS_COMMON に/nodefaultlib:msvcprt.lib /nodefaultlib:msvcprtd.libを書き足す。FLAGS_COMMON に -Zc:wchar_t -Zc:forScope を書き足す。(いろいろ見たところBoost::Regexのためっぽい。)
  2. nmake -f vc71.mak
  3. インストールしても良いのかもと思うけど、STLPortのバージョンが変わったら無駄なく入れ替えたいので、INCLUDEとLIBにパスを書き足しておいた方がよいと思う。

Boostのインストール

  1. tools\build\v1\msvc-tools.jamのactions together vc-Linkとかいう関数のなかにリンカオプションの設定ができるので、/nodefaultlibにlibcpmt.libとlibcpmtd.libとmsvcprt.libとmsvcprtd.libを書き足し。(これ他で書けると思う。)
  2. コンパイルする。凄く時間がかかる。コンパイルはbjamにやってもらう。コマンドライン指定は下を参照。(1行で入力で改行をスペースで置換。)
  3. インストールしても良いのかもと思うけど、Boostのバージョンが変わったら無駄なく入れ替えたいので、INCLUDEとLIBにパスを書き足しておくこと。LIBはBoost_1-33_0\stageに通せばよい。
    bjam “-sTOOLS=vc-7_1-stlport” “-sMSVCDir=[VCToolkit2003のインストールディレクトリ]”
    “-sSTLPORT_PATH=[STLportのヘッダーのあるディレクトリ]”
    “-sSTLPORT_VERSION=4.6.2”
    “-sBUILD=debug on <native-wchar_t>on” stage
    これでおしまい。基本的にWindowsのCプログラムでも同様だけども、何個か足りないライブラリとコマンドがあるので、ひたすら怪しいディレクトリにパスを通しまくったら、Boostがコンパイルできたっぽい。終わったらテストしたくなるのは人情というもので、気軽に試せそうなPreprocessを使う以下のサンプルをプリプロセッサ(コンパイルしないのかい!)に通してみよう。
#include <boost/preprocessor.hpp>
#define PRED(r, state) BOOST_PP_TUPLE_ELEM(2,1,state)
#define OP(r, state) (BOOST_PP_ADD(BOOST_PP_TUPLE_ELEM(2,0,state),BOOST_PP_TUPLE_ELEM(2,1,state)), BOOST_PP_DEC(BOOST_PP_TUPLE_ELEM(2,1,state)))
#define SUM(n) BOOST_PP_TUPLE_ELEM(2,0,BOOST_PP_WHILE(PRED,OP,(0,n)))
// 1から10までの和
SUM(10)

以下のようにして実行する。(このプログラムをコンパイルするとエラーになりますので。)
cl /EP hoge.cpp
ちゃんと55と表示されるはずである。あとは…

  • shard_ptrでBoost的Smart Pointerの恩恵を受けて見るも良し
  • オーソドックスにGeneric Programmingに勤しむも良し
  • Boost::MPLでメタプログラミングに目覚めて見るも良し
  • Boost::Preprocesserでマクロの深淵を見るも良し
  • Boost::lambdaやBoost::bindで遊んだ後にFC++で関数型プログラミングにチャレンジして見るも良し
  • Boost::Spiritで字句解析・構文解析に励むも良し
  • Boost::uBlasでTemplate Expressionによる計算に目覚めるも良し
    まぁいろいろである。C++なんて古い言葉だよとか言っちゃいけない。マルチパラダイムな世界を突っ走っているだけあって、ここ数年のC++の進化は劇的です。なんて言ったって_C++って関数型言語だったのね_。だれかSICPをC++で読み解くという人はいない物か。
    まぁここまで準備すれば、一応Windowsのプログラム(Meadowとか)もちゃんとコンパイルできるだろうと思います。試してないけど。