Boost.Pythonをやってみた

http://boost.cppll.jp/BDTJ_1_29/libs/python/doc/tutorial/doc/building_hello_world.html
をやってみた。
環境はWindowsXP VC8(ExpressEdtion)
boost-1.37.0に添付されているサンプルはそのままでは動かず結構苦労した。
過去のバージョンが放置されているっぽい。
せっかくなのでメモりまっす。


pythonインストール。
先月出ていたバージョン2.6をさくっとインストール。
ついでに後の工程で楽をするために以下の環境変数を設定。

 PYTHON_ROOT=C:\python26
 PYTHON_VERSION=2.6
 INCLUDE=C:\boost
 LIB=C:\boost\lib

boostのpythonモジュールをビルドする(ソースでインストールしていたので)
boostのアーカイブはc:\boostに展開している。
bjamはすでにパスが通してある。
Visual Studio 2005 コマンド プロンプト

 > cd c:\boost
 > bjam.exe --toolset=msvc-8.0 --stagedir=. link=static,shared release debug stage 

tutorial開始

 > C:\boost\libs\python\example\tutorial
 > bjam -sTOOLS=msvc --debug-configuration

でエラー出てとまる。

rule python-extension unknown in module Jamfile

英語のメーリングリスト(場所失念)で同じ問題でこけているのを発見し修正する。
tutorialのディレクトリのJamrootファイルで

 python-extension hello_ext : hello.cpp ;

の前の行に

 using python ; 

を入れる。

これで実行すると次のようなエラーがでる。

error: Unable to find file or target named
error:     '/boost/python/boost_python'
error: referred from project at
error:     '.'

Jamrootでリンクファイルを指定していると思しき箇所をコメントアウトする。
Windows版のboostはリンクファイル自体は多分pragmaで指定されるので明示する
必要が無いのとそのためにLIB環境変数を指定しているので。

#project
#  : requirements <library>/boost/lib/boost_python ;

再度

 > bjam -sTOOLS=msvc --debug-configuration

前より進んだところでエラーが出る。
途中まではうまくいったようで
C:\boost\libs\python\example\tutorial\bin\msvc-8.0express\debug\hello_ext.pyd
ができているのでビルドはうまくいっているっぽい。
これをtutorialディレクトリにコピーして

 > python hello.py

とすると

 Traceback (most recent call last):
   File "hello.py", line 6, in <module>
     import hello_ext
 ImportError: DLL load failed: 指定されたモジュールが見つかりません。

しばらく悩んだあとでdependency walkerでhello_ext.pydを見てみた。

 BOOST_PYTHON-VC80-MT-GD-1_37.DLL

を要求しておりました。
おぉ、BOOSTに依存したモジュールができるのか。
C:\boost\libで該当ファイルを探してカレントにコピーしたところ無事動いた。

これでチュートリアルはこなせた。
bjam使わない方が簡単なのではなかろうか。