らんだむな記憶

blogというものを体験してみようか!的なー

Boost.Python(2)

参照渡しな引数を持つメソッドをexportできるんかなと思って試したらできた。

namespace hoge {

class Fuga {
 public:
    void addFoo(Foo& foo);
};

}

BOOST_PYTHON_MODULE(test_module)
{
    using namespace boost::python;

    class_<hoge::Fuga>("Fuga")
        .def("addFoo", &hoge::Fuga::addFoo)
    ;
}

ほんで、

from test_module import Fuga, Foo

fuga = Fuga()
foo  = Foo()

fuga.addFoo(foo)

って感じで試した。addFooのとこまでは、pythonスクリプト内で生成したオブジェクトの参照が渡ってきているみたい。インタープリタ側がいつまで寿命管理してくれるのか分からんので、addFoo内でコピーしたほうが安全だろうね。

namespaceを使ってモジュール設計できるし、公開メソッドで参照渡しの形で書いていても問題ないし、案外気軽に使えるな。
も・ち・ろ・ん、コンパイルエラーの時はboooooOOOOOSTTTTだけども...。

あぁ、あぁ、pythonでC言語拡張モジュール - らんだむな記憶と比べると確かに、Boost.Pythonは神だゎ。旧来のスタイルとかもう吐くね。PyArg_ParseTupleってなんすかぷぷぷーって感じだ。なんでsscanfみたいなことせなあかんねんと。しかし、この代償としてboostが憑いてくるのかぁ...。
よく見ると、この時にpython-dev入れたんか。全然覚えてないしっ!

そして、本当にクソな話だが、年齢のせいもあって、もうMakefileとか覚えられないから、多段ディレクトリ構成でのMakefileの連鎖のサンプルを備忘録として貼っておこう...。ほんとうダメダメな内容だなぁ...。これじゃ複数個のstatic librariesを結合する場合に耐えられないじゃないか...。

TARGET=hoge.a

OBJS = Fuga.o Foo.o

INC += -I.

CXXFLAGS += $(INC) -fPIC

################################################################################

.PHONY: all
all: $(TARGET)

$(TARGET): $(OBJS)
    $(AR) $(ARFLAGS) $@ $^

.cpp.o:
    $(CXX) $(CXXFLAGS) -c $<

.PHONY: clean
clean:
    rm -rf $(TARGET) $(OBJS)
TARGET=test_module.so

OBJS = test.o

# /usr/include/python2.7
CXXFLAGS += -I`python -c 'from distutils.sysconfig import *; print get_python_inc()'`

INC += -I. -I./core -I/opt/boost_1_58_0/include

CXXFLAGS += $(INC) -fPIC
LIBS += -L/opt/boost_1_58_0/lib -lboost_python
STATIC_LIB += core/hoge.a
LDFLAGS += -shared $(LIBS)

################################################################################

.PHONY: all
all: $(TARGET)

$(TARGET): $(STATIC_LIB) $(OBJS) 
    $(CXX) -Wall -o $(TARGET) $(OBJS) $(STATIC_LIB) $(LDFLAGS)

$(STATIC_LIB):
    make -C core

.cpp.o:
    $(CXX) $(CXXFLAGS) -c $<

.PHONY: clean
clean:
    rm -rf $(TARGET) $(OBJS)
    make clean -C core