いよいよBoost Pythonを使うことに
実は試行錯誤の繰り返しでした…
「書いてみたけどビルドできない」の繰り返しでしたが、なんとかboost-pythonのコードを書くことができましたので、その手順を紹介します。
各種prerequisitesについてはこちらをご参考ください。
Eclipseでクロスコンパイラ用のプロジェクトを作ろう
まず、Eclipseを開いてc++プロジェクトを作りましょう。
今回はboost-pythonを使ってpythonライブラリを作りますので、shared library > cross compilerを選びます。
次にやることは、自分でクロスコンパイラを設定するところです。
(自動でやってくれないんですねT_T)
which gcc-x (xはバージョン)
でパスを調べられます。
私はgcc-7を入れたので、gcc-7にして調べてそのパスを入れました。
テストコードを書く
そして設定が終わったら、いよいよコードを書くことになります。
Boost.Pythonのホームページで、次のようなソースコードを引っ張ってきました。
char const* greet()
{
return "hello, world";
}
#include <boost/python.hpp>
BOOST_PYTHON_MODULE(hello)
{
using namespace boost::python;
def("greet", greet);
}
注意すべきことは、プロジェクトの名前、BOOST_PYTHON_MODULE
の中のモジュール名、そして最終的にビルドされる.so
ファイルの名前が全て一致しないといけないということです。
特に.so
ファイルの名前ですが、これはcmakeでいうprefixというものらしくて、eclipseのデフォルトはlibとなっています。
これは次のように設定できます。
プロジェクトを右クリックしてpropertiesを開き、
C/C++ Build > Settings > Build Artifact
の"Output prefix"でprefixを空白に設定します。
つまりlibを消すということです。
include pathとlibrary pathを指定する
includeすべきもの
- boostのinclude path brew install boostの場合、デフォルトは次のようになります。
/usr/local/Cellar/boost/(version)/include
- pythonのinclude path 要するに、"pyconfig.h"がある場所をincludeする、ということです。 わからなかったら
find /usr/local -name pyconfig.h
で調べてあげましょう。
そのうち、自分のデフォルト設定と同じバージョンのやつを選んでinclude pathにすればいいです。
私の場合、pyconfig.h
は以下のようなところにありました。
/usr/local/Cellar/python/2.7.12/Frameworks/Python.framework/Versions/2.7/include/python2.7/pyconfig.h
/usr/local/Cellar/python/2.7.12_2/Frameworks/Python.framework/Versions/2.7/include/python2.7/pyconfig.h
/usr/local/Cellar/python/2.7.14/Frameworks/Python.framework/Versions/2.7/include/python2.7/pyconfig.h
/usr/local/Cellar/python3/3.5.2_1/Frameworks/Python.framework/Versions/3.5/include/python3.5m/pyconfig.h
/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/include/python3.5m/pyconfig.h
/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6/include/python3.6m/pyconfig.h
/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/include/python3.6m/pyconfig.h
/usr/local/include/python3.3m/pyconfig.h
私はデフォルトのpython3をpython3.6.3に設定したので、
/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/include/python3.6m
をincludeしました。
C/C++ Buildでも設定はできますが、Generalにすると全てのConfiguration/全ての言語(assembly, C, C++)について一気に設定できて便利です。
library pathの設定
- boost-python libraryのpath
- pythonのlib path を設定します。
- brew installでboost-pythonをインストールすると、デフォルトパスは次のようになります。
/usr/local/Cellar/boost-python/1.65.1/lib
- pythonのlibパスは、さっきincludeした2つ上のフォルダの下にlibをつければいいです。 私の場合は次のようになりました。
/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib
libの場合は、名前の指定もしないといけません。
設定する名前は次の2つです。
python3.6 (バージョンに合わせて)
boost_python3
設定は、次のように、C/C++ Build > Settings > Cross G++ Linker > Libraries
で行います。
ここで注意すべきことは、includeの場合はパスが上、名前が下になっていますが、
ライブラリの場合はその逆ということです。
という感じで設定すると、めでたくビルドが通るようになります!
pythonにimportしてみよう
import sys
sys.path.append("/path/to/your/module/directory")
import hello # your module name
hello.greet() # a function of your module
こうやると、
'hello, world'
が表示されるようになります。
これでやっとMac/Eclipseでboost-pythonが使えるようになりました…
こうやってまとめてますが、ここまで1週間以上かかってますT_T
仕事とは別に空き時間にやってるもんですからね…
次は、boost-pythonで開発したものを持ってきます!