PythonモジュールをC++で作る(Mac)

$ brew install boost-python --with-python3

で以下のディレクトリにインストールされる。

/usr/local/Cellar/boost/1.65.1/include/    #header
/usr/local/Cellar/boost-python/1.65.1/lib/ #.a, dylib

中身を確認したけど、*.a が静的ライブラリで、*.dylib が共有ライブラリ(Linuxだと*.so)、という感じに生成されていた。自前でBoost.Pythonをビルドする必要はないようだ。

$ g++ -fPIC -I/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6/include/python3.6m/ -c test_hoge.cpp
$ g++ -shared -I/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6/include/ -L/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6/lib/ -lpython3.6 -lboost_python3 -lboost_numpy3 test_hoge.o -o test_hoge.so
$ otool -L test_hoge.so
test_hoge.dylib:
	test_hoge.dylib (compatibility version 0.0.0, current version 0.0.0)
	/usr/local/opt/python3/Frameworks/Python.framework/Versions/3.6/Python (compatibility version 3.6.0, current version 3.6.0)
	/usr/local/opt/boost-python/lib/libboost_python3.dylib (compatibility version 0.0.0, current version 0.0.0)
	/usr/local/opt/boost-python/lib/libboost_numpy3.dylib (compatibility version 0.0.0, current version 0.0.0)
	/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.4.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)

> import test_hoge
> test_hoge.hello()
'hello, world'

できた。なお、*.dylibとか*.pydとしてモジュールを作成すると、なぜかimportできなかった。なんでさ? homebrewでインストールしたPython3だとなんでこうなるのか・・・。


Mac版のコンパイル・リンクの方法はLinuxでもなぞらえてできるだろうな。Linuxの場合はapt-get installか何かでサクッとできると思う。


Windows/Mac/LinuxPythonモジュールをC/C++で作れるようになったわけで、じゃあC++でバリバリ便利な関数を作りましょうということで。(全部C++で書くのはどうなん?(え