2009年8月25日火曜日

Boost::Pythonでshared_ptrを使う術

Boost::Pythonでshared_ptrを使うには、先に宣言しよう。
BOOST_PYTHON_MODULE(gaga)
{
boost::python::register_ptr_to_python<boost::shared_ptr >();
boost::python::class_("gigi")
.def("gugu", &gugu)
;
...
...
}

2009年8月22日土曜日

Boost::Python

Boost::Pythonはソースに手を入れなければならないと思われているがそんなことはない。サンプルがそのようであるからで、実際にはヘッダーファイルをインクルードしたラッパーを書けば1丁上がりである。元になるライブラリがDLLならラッパーだけのDLLができてライブラリのDLLを読みに行ってくれる。すなわち軽量。しかもラッパーはC++のソースだからわかりやすい。Python以外のLLにポートしないのならSwigよりおすすめです。

2009年8月20日木曜日

Boost::Pythonに泣く

pythonの拡張をC++でしようと思ってubuntuでやっていたことをVC++に持っていくとpython25.dllがないと怒られた。そんなもん使ってないのになんでいるんだとしばらく毒づいていた。
ふと気づいて、dependencywalkerで見てみると、なんとboost::pythonのライブラリが依存していた。そうそう、このライブラリ構築したのはpython25のときでした。「スマンカッタ。」
そこでboostライブラリの再構築。しかし時間かかるなーあ。complete指定だと優に1時間かかったが、こんどはエラー吐かなくなった。目出度しめでたし。

2009年8月8日土曜日

pythonのsetup.pyにswigでC++のオプションを付けるの術

from distutils.core import setup, Extension

setup(
ext_modules = [
Extension('_example', ['example.i', 'example.cxx', 'sample.cxx'],
library_dirs=[],
libraries=[],
extra_compile_args=[],
extra_link_args=[],
swig_opts=["-c++"],)
])

VS2005でpythonの拡張を行うの術(まとめ)

prebuildされたpython25はVS7.1、python26はVS2008でコンパイルされているためVS2005しか持っていないときはsetup.pyでbuildすることはできない。(たぶん)
これを回避するには、
1)VS2005でdllを作ってしまう。
2)mingwを導入する
3)VS7.1もしくはVS2008を導入する。
4)sourceよりpythonをコンパイルして自分の物とする。
と言う方法が考えられる。
ここでは1)についてまとめる。

手順は次のとおり。
1)VS2005でdllを作成できるようにする。(以前のエントリが少し助けになる。)
2)dllを作成し、名前を[package_name].pydに変更する。
3)C:Python26/DLLsの下に[package_name].pydと[package_name].py置く。
4)importしてみる。

おまけ。
prebuildされたpythonにはpython26_d.libは含まれていない。C,C++でpythonインタープリターを使いたいときdebugが必要なら、sourceを引っ張ってきてコンパイルしてできたpython26_d.libをC:Python26/libsの下へ入れればよい。

cmakeでリンクするファイルをdebugとreleaseでカエルの術

昨日のエントリから
target_link_libraries(example debug boost_python-vc80-mt-gd-1_39 debug ${PYTHON_DEBUG_LIBRARIES}
optimized boost_python-vc80-mt-1_39 optimized ${PYTHON_LIBRARIES})
とそれぞれのライブラリにdebugもしくはoptimizedをつければよい。

2009年8月6日木曜日

windows上でC++でpython拡張するの術

example.i, example.h, example.cppを作ってコマンドラインから
Cだけなら
$ swig -python example.i
C++なら
$ swig -c++ -python example.i
とすると
example_wrap.cxx
とexample.pyができる。

CMakeList.txtにむにゃむにゃと
#-----------------------------------------------------------------------------
set (BoostPython_SRCS
example.cxx
example.h
example.i
example_wrap.cxx
)
#-----------------------------------------------------------------------------
add_library(example SHARED ${BoostPython_SRCS})
target_link_libraries(example debug boost_python-vc80-mt-gd-1_39 debug ${PYTHON_DEBUG_LIBRARIES}
optimized boost_python-vc80-mt-1_39 optimized ${PYTHON_LIBRARIES})
target_link_libraries(example boost_python-vc80-mt-gd-1_39 ${PYTHON_LIBRARIES} )
#-----------------------------------------------------------------------------
何てやってから、ビルドするとexample.dllができる。

できたexample.dllを_example.pydと名前を変えてC:Python26/DLLsの下に置く。
ついでにexample.pyもそこへ置く。

後は、
$ python
>>>import example
>>>
と読み込めればOK
VS2005でコンパイルしてもOK

2009年7月29日水曜日

vtkImagePlaneWidgets

vtkImagePlaneWidgetsでvtkCellPickerで取得した値がwindowの下に隠れて見えない。
しかたがないのでソースを読むが分からんかった。
対症療法だが、GenerateText()メソッドの中の
coord->SetValue(.01, .01);
を
coord->SetValue(0.01, 0.05);
に変えて見えるようになった。
と思ったら、別のパネルに貼り付ける奴では普通に見えた???
このクラスの問題ではないか???

2009年7月14日火曜日

BOOST_PP_SEQ_ELEM_III error

これもしばらく苦しんだのでメモ
"BOOST_PP_SEQ_ELEM_III" requires 2 arguments, but only 1 given とでたら、
BOOST_PP_SEQ_ELEMを遅延評価に。
BOOST Archives
参照

2009年7月13日月曜日

VC++でunit test

cmakeで作成したVC++のプロジェクトでunit testを実行するには、solutionの中のRUN_TESTSをビルドしよう。

2009年7月11日土曜日

boost::preprocessor nested seq

しばらく苦しんだのでメモ。
boost::preprocessorで入れ子のコンテナ例えばシーケンスのシーケンスを処理するとき同じマクロを2度使えない。
#define SEQ ((Red)(Blue))((Blue)(Red))((Black)(White))((While)(Black))
を処理しようとすると、
○
#define INNER_MACRO(r, data, i, elem) BOOST_PP_CAT(elem, data)
#define OUTER_SEQ(r, data, elem) \
BOOST_PP_SEQ_FOR_EACH_I(INNER_MACRO, _, elem)

BOOST_PP_SEQ_FOR_EACH(OUTER_SEQ, _, SEQ)
×
#define INNER_MACRO(r, data, elem) BOOST_PP_CAT(elem, data)
#define OUTER_SEQ(r, data, elem) \
BOOST_PP_SEQ_FOR_EACH(INNER_MACRO, _, elem)

BOOST_PP_SEQ_FOR_EACH(OUTER_SEQ, _, SEQ)

VC++で確認するには
cl /EP/ /I c:\Boost\include\boost-1_39 .\test.h
おまじない
"C:\Program Files\Microsoft Visual Studio 8\VC\bin\vcvars32.bat"
も忘れないように。

追記:IDEからはプロジェクトのプロパティ->プリプロセッサ->前処理済みのファイル生成=>行番号なし、で確認できる。