物置き

boost::pythonを利用するときは#includeはしなくていいというか、しないほうがいい(VisualStudioでの話)

Python.hをインクルードすると、自動的に.libファイルをリンクしてくれるようになっている。
リリースビルドの場合、リンクされるlibファイルはpythonXX.lib、
デバッグビルドの場合にはpythonXX_d.libとなる。
(XXはバージョン番号)


ただ、Debug版のpythonXX_d.libの方は、Pythonの標準配布ファイルには含まれていないため
ソースファイルの方をダウンロードしてきて、自分で作成する必要がある。
でも、それはちょっと面倒だし、だいたいPythonソースコードの中まで追えるようにする必要はあまり無かったりする。


boost::pythonはその辺を考慮して、#includeの内部で
一時的に_DEBUGマクロを無効化して、Python.hをインクルードしてくれている。
これにより、boost/python.hppをインクルードした場合には、デバッグ/リリースビルドのいずれの場合でもRelease版であるpythonXX.libがリンクされることになる。


にもかかわらず、それとは別にPython.hを独自にインクルードしてしまうと、
デバッグビルドの際に、pythonXX_d.libとpythonXX.libの両方がリンクされてしまう。
(できあがるモジュールは、pythonXX_d.dllとpythonXX.dllの両方に依存してしまう)


そのモジュールをPython側でimportしたところ、


> Fatal Python error: PyThreadState_Get: no current thread


というエラーが発生して、利用することができなかった。
(環境によって違うかも)


デバッグビルドで作成したものは動かないのに、リリースビルドでは動くのでとても混乱した。


ぐぐってみた結果、下記のエントリを見て原因がわかった。ありがたいことです。

Boost.Python(6) - REMINISCENCE//0x
http://d.hatena.ne.jp/kikuty/20080121


しかし、このへんのことはドキュメント見れば書いてあったりすることなんだろうか。ちゃんとドキュメント読まないとなあ・・