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

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

各種prerequisitesについては[こちら](https://qiita.com/kyosuu1/items/0c214e1e5c671a727bc0)をご参考ください。

## Eclipseでクロスコンパイラ用のプロジェクトを作ろう
まず、Eclipseを開いてc++プロジェクトを作りましょう。
今回はboost-pythonを使ってpythonライブラリを作りますので、shared library > cross compilerを選びます。
![begin_project.png](https://qiita-image-store.s3.amazonaws.com/0/150771/fdf9219e-42ba-e3d2-b05d-e1dfa88c6fd9.png)

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

```console
which gcc-x (xはバージョン)
```
でパスを調べられます。
私はgcc-7を入れたので、gcc-7にして調べてそのパスを入れました。
![cross_compiler.png](https://qiita-image-store.s3.amazonaws.com/0/150771/b937974c-a6b3-cd7b-ab10-a3bf96935c97.png)

# テストコードを書く
そして設定が終わったら、いよいよコードを書くことになります。
Boost.Pythonのホームページで、次のようなソースコードを引っ張ってきました。

```cpp
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](https://qiita-image-store.s3.amazonaws.com/0/150771/02cfc355-c0c1-6749-af42-03d43a80e1ad.png)

プロジェクトを右クリックしてpropertiesを開き、
```C/C++ Build > Settings > Build Artifact```
の"Output prefix"でprefixを空白に設定します。
つまりlibを消すということです。

## include pathとlibrary pathを指定する
### includeすべきもの
  - boostのinclude path
    brew install boostの場合、デフォルトは次のようになります。

```console
/usr/local/Cellar/boost/(version)/include
```
  - pythonのinclude path
    要するに、"pyconfig.h"がある場所をincludeする、ということです。
    わからなかったら

```console
find /usr/local -name pyconfig.h
```
で調べてあげましょう。
そのうち、自分のデフォルト設定と同じバージョンのやつを選んでinclude pathにすればいいです。
私の場合、`pyconfig.h`は以下のようなところにありました。

```console
/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に設定したので、

```console
/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/include/python3.6m
```
をincludeしました。

設定する場所は次のようになります。
![include_path.png](https://qiita-image-store.s3.amazonaws.com/0/150771/77b5c4cf-d627-da26-1ad4-b07c0d89f692.png)

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

### library pathの設定
- boost-python libraryのpath
- pythonのlib path
を設定します。

1. brew installでboost-pythonをインストールすると、デフォルトパスは次のようになります。

```console
/usr/local/Cellar/boost-python/1.65.1/lib
```

2. pythonのlibパスは、さっきincludeした2つ上のフォルダの下にlibをつければいいです。
私の場合は次のようになりました。

```console
/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib
```

libの場合は、名前の指定もしないといけません。
設定する名前は次の2つです。

```console
python3.6 (バージョンに合わせて)
boost_python3
```

設定は、次のように、`C/C++ Build > Settings > Cross G++ Linker > Libraries`で行います。
![library_path.png](https://qiita-image-store.s3.amazonaws.com/0/150771/22574580-1744-7169-21d4-4e16fafd9324.png)

ここで注意すべきことは、includeの場合はパスが上、名前が下になっていますが、
ライブラリの場合はその逆ということです。

という感じで設定すると、めでたくビルドが通るようになります!

## pythonにimportしてみよう
```py3
import sys
sys.path.append("/path/to/your/module/directory")
import hello # your module name
hello.greet() # a function of your module
```

こうやると、

```py3
'hello, world'
```
が表示されるようになります。

これでやっとMac/Eclipseでboost-pythonが使えるようになりました…

こうやってまとめてますが、ここまで1週間以上かかってますT_T
仕事とは別に空き時間にやってるもんですからね…

次は、boost-pythonで開発したものを持ってきます!