在python代码加载我的共享库时导入错误。

时间:2016-05-02 10:42:26

标签: python c++ boost makefile pyenv

我想问一个关于构建以下代码的问题。一个问题是我不能从python对象调用complied .so文件。也许,一个原因是python无法找到一个boost库(libboost_python.dylib)。但是$ 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)
    ;
}

我假设我将从python代码访问这个c ++类及其mender函数。例如,

# klass.py
import klass
a = klass.World()

构建此代码的makefile是

#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)

有任何建议吗?

Best,Hashi

0 个答案:

没有答案