使用Boost Python包装C ++函数 - numpy数组类型

时间:2017-03-05 19:39:30

标签: python c++ macos numpy boost

从我收集的内容来看,一个好方法是使用Boot.Python库,例如this simple example;请不要推荐像Cython这样的替代品作为解决方案。但是当我尝试使用boost::python数据类型时,我的cpp文件不会构建。

example_boost.cpp:

#include <boost/python.hpp>
#include <boost/python/numpy.hpp>

#include <iostream>

namespace bpy = boost::python;
namespace bnp = boost::python::numpy;

void do_stuff(const bnp::ndarray& input_array) {
    ...
};

/*
 * This is a macro Boost.Python provides to signify a Python extension module. This enables me to import example_boost.cpp and call do_stuff() within a Python file. 
 */
BOOST_PYTHON_MODULE(crf) {
    // Expose the functions
    boost::python::def("compute_factor_out_msgs", compute_factor_out_msgs);
}

正在运行make ...

Undefined symbols for architecture x86_64:
      "boost::python::converter::object_manager_traits<boost::python::numpy::ndarray>::get_pytype()", referenced from:
          boost::python::detail::caller_arity<1u>::impl<OutMessages (*)(boost::python::numpy::ndarray const&), boost::python::default_call_policies, boost::mpl::vector2<OutMessages, boost::python::numpy::ndarray const&> >::operator()(_object*, _object*) in example_boost.o
    ld: symbol(s) not found for architecture x86_64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    make: *** [example_boost.so] Error 1

注意:

    如果我不使用makebpy类型,则
  • bnp成功,因此我的Makefile是正确的。
  • 我在Mac OSX El Capitan
  • 上通过自制程序安装了Boost v 1.63.0
  • 使用C ++ 11和Python 2.7

1 个答案:

答案 0 :(得分:1)

发布的示例代码有两个问题:

  1. 要解决制作问题,Makefile必须也链接-lboost_numpy

  2. 即使它会编译,结果也会是一个seg错误(堆栈溢出)因为我们需要先用

    进行初始化

    Py_Initialize(); BNP ::初始化();

  3. 解释here