プログラミング:boost.pythonでモジュール構築(その1)

boost.pythonを使って何かしてみたくなったので、適当にネットを検索、次に、このサイトにある下記のプログラムをcompileしたところ、pyconfig.hがないと出たので、pyconfig.hとかいう問題のヘッダーファイルを早速インストールすることにした。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <boost/python.hpp>
namespace bp = boost::python;
void entry_hello_world()
{
printf("hello world\n");
}
double entry_square(double x)
{
return x * x;
}
BOOST_PYTHON_MODULE(_func)
{
bp::def("hello_world", entry_hello_world);
bp::def("square", entry_square);
}

ネットで色々調べると、python3.6devをインストールする必要があることが分かった。

sudo add-apt-repository ppa:jonathonf/python-3.6
sudo apt-get update
sudo apt-get install python3.6-dev

下記のコマンドを打ち込むと、今度は、-lboost_pythonとか意味分からんと言われた。

g++ -shared _func.cpp -lboost_python -I/usr/include/python3.6/ -fPIC -o _func.so

ネットで検索すると、このサイトが、libboost-python-devをインストールすれば解決できるみたいに書いてあったので、早速それをインストールした。

sudo apt install libboost-python-dev

やっと完成したライブラリをインポートしたら、無情にもエラーが吐き出された。

----> 1 import _func
2 print (_func.square(2))

ImportError: /usr/lib/x86_64-linux-gnu/libboost_python-py27.so.1.58.0: undefined symbol: PyClass_Type

ネットで調べたら、このサイトに、libboost-python-dev-35を使うと書いてあった。

g++ -shared _func.cpp -lboost_python-py35 -I/usr/include/python3.6/ -fPIC -o _func.so

今度はうまくファンクションが機能してくれた。


今度は、Numpy arrayとかいうのをやってみる。

スポンサーリンク