1

我想问一个关于构建以下代码的问题。一个问题是我无法从 python 对象调用已编译的 .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++ 类及其修复函数。例如,

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

有什么建议吗?

最好的,哈希

4

0 回答 0