VC8(Visual Studio 2005)でSWIGを使ってみる

http://python.matrix.jp/tips/cpp_extension.html
こちらの手順を参考にやってみる。エラー

error: Python was built with Visual Studio 2003;

http://d.hatena.ne.jp/moriyoshi/20070518/1179490110
これで上記の件は解決。しかしエラー

d:\python25\include\pyconfig.h(189) : fatal error C1083: include ファイルを開けません。'basetsd.h': No such file or directory
error: command 'cl.exe' failed with exit status 2

basetsd.hは
D:\Program Files\Microsoft Platform SDK\Include\BaseTsd.h
だった。
環境変数を確認すると

INCLUDE=D:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE;D:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE;

となっていてPlatform SDKの分が入っていない。
とりあえず

SET INCLUDE=D:\Program Files\Microsoft Platform SDK\Include;%INCLUDE%

これでコンパイル完了。しかし、

import sample

するとmsvcr80.dllが無いよっていわれる。
適当にマシン内(Program Files)を検索して見つかったのをpython25ディレクトリにコピー。
更に、

R6034 An application has made an attempt to load the C runtime library incorrectly. Please contact the application's support team for more information

といわれる。
これは、
http://d.hatena.ne.jp/moriyoshi/searchdiary?word=*%5BWindows%5D
にあるようにpython.exe.manifestを置き換えることで解決した。
かくして、動作を確認できました。
manifestが何なのかよくわからないが依存するランタイムをこれをみて選んでいるということなのか。


手順を整理すると

  1. swigにパスを通す
  2. distutils対策 http://d.hatena.ne.jp/moriyoshi/20070518/1179490110
  3. sample.i, sample.cpp, sample.h, setup.pyを作成
  4. D:\Program Files\Microsoft Visual Studio 8\Common7\Tools\vsvars32.batのIncludeにD:\Program Files\Microsoft Platform SDK\Includeを追加する。
  5. プロンプト開いて D:\Program Files\Microsoft Visual Studio 8\VC\vcvarsall.bat
  6. setup.py build_ext --swig-opts=-c++
  7. msvcr80.dllをpython.exeと同じディレクトリにコピー
  8. python.exe.manifestを置き換え
  9. import sampleを試してみる

という感じ。なかなか険しい道のりであります。