1

次のコードの作成について質問したいと思います。問題は、コンパイルされた .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)

何かアドバイスはありますか?

ベスト、はし

4

0 に答える 0