次のコードの作成について質問したいと思います。問題は、コンパイルされた .so ファイルを python オブジェクトから呼び出せないことです。おそらく、Python がブースト ライブラリ (libboost_python.dylib) の 1 つを見つけられないことが原因です。しかし $DYLD_LIBRARY_PATH には libboost_python.dylib がインストールされたディレクトリがあります。
//klass.cxx
#include <boost/python.hpp>
#include <string>
#include <iostream>
class World
{
public:
void set(std::string msg) { this->msg = msg; }
std::string greet() { return msg; }
std::string msg;
};
BOOST_PYTHON_MODULE( klass )
{
using namespace boost::python;
class_<World>("World")
.def("greet",&World::greet)
.def("set",&World::set)
;
}
この C++ クラスとそのメンダー関数に Python コードからアクセスするとします。例えば、
# klass.py
import klass
a = klass.World()
そして、このコードをビルドするためのメイクファイルは
#makefile
CONDADIR=/Users/XYZ/.anyenv/envs/pyenv/versions/anaconda2-4.0.0
INCDIR=$(CONDADIR)/include
PYDIR=$(INCDIR)/python2.7
OPT=-I$(INCDIR) -I$(PYDIR) -L$(CONDADIR)/lib -lpython2.7 -lboost_python
#RPATHOPT=-rpath -Xlinker $(CONDADIR)/lib
all:klass.cxx
g++ $(RPATHOPT) -fPIC -shared $(OPT) -o klass.so klass.cxx
このコードをビルドした後、make コマンドによって、作業ディレクトリに "klass.so" が作成されました。C++ クラス "World" を呼び出す Python コードを実行します。
[XYZ@OSX wrapper_boost] python klass.py
Traceback (most recent call last):
File "klass.py", line 2, in <module>
import klass
ImportError: dlopen(/Users/XYZ/Work/python/wrapper_boost/klass.so,
2):Library not loaded: @rpath/./libboost_python.dylib
Referenced from: /Users/XYZ/Work/python/wrapper_boost/klass.so
Reason: image not found
DYLD_LIBRARY_PATH は...
[XYZ@OSX wrapper_boost] echo $DYLD_LIBRARY_PATH
:/usr/local/Cellar/openssl/1.0.2d_1:/usr/local/Cellar/openssl/1.0.2d_1/lib:/Users/XYZ/.anyenv/envs/pyenv/versions/anaconda2-4.0.0/lib
生成された .so ファイルにリンクされているライブラリは次のとおりです。
[XYZ@OSX wrapper_boost] otool -L klass.so
klass.so:
klass.so (compatibility version 0.0.0, current version 0.0.0)
libpython2.7.dylib (compatibility version 2.7.0, current version 2.7.0)
@rpath/./libboost_python.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.1.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)
何かアドバイスはありますか?
ベスト、はし