LoginSignup
1
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-10-13

いよいよ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で開発したものを持ってきます!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0