Mac
Eclipse
MacOSX
BoostPython
HighSierra

Mac/EclipseでBoost Pythonを使う(python3.x) その2

いよいよBoost Pythonを使うことに

実は試行錯誤の繰り返しでした…
「書いてみたけどビルドできない」の繰り返しでしたが、なんとかboost-pythonのコードを書くことができましたので、その手順を紹介します。

各種prerequisitesについてはこちらをご参考ください。

Eclipseでクロスコンパイラ用のプロジェクトを作ろう

まず、Eclipseを開いてc++プロジェクトを作りましょう。
今回はboost-pythonを使ってpythonライブラリを作りますので、shared library > cross compilerを選びます。
begin_project.png

次にやることは、自分でクロスコンパイラを設定するところです。
(自動でやってくれないんですねT_T)

which gcc-x (xはバージョン)

でパスを調べられます。
私はgcc-7を入れたので、gcc-7にして調べてそのパスを入れました。
cross_compiler.png

テストコードを書く

そして設定が終わったら、いよいよコードを書くことになります。
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となっています。
これは次のように設定できます。
prefix_change.png

プロジェクトを右クリックして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しました。

設定する場所は次のようになります。
include_path.png

C/C++ Buildでも設定はできますが、Generalにすると全てのConfiguration/全ての言語(assembly, C, C++)について一気に設定できて便利です。

library pathの設定

  • boost-python libraryのpath
  • pythonのlib path を設定します。
  1. brew installでboost-pythonをインストールすると、デフォルトパスは次のようになります。
/usr/local/Cellar/boost-python/1.65.1/lib
  1. 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で行います。
library_path.png

ここで注意すべきことは、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で開発したものを持ってきます!