使用boost::numpy:: narray时出现分段错误

Segmentation fault when using boost::numpy::ndarray

本文关键字:分段 错误 narray boost numpy 使用      更新时间:2023-10-16

当我试图通过boost::numpy::ndarray作为参数时,我得到了我认为是一个奇怪的段故障:

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

void say_hello(boost::numpy::ndarray& my_array)
//void say_hello(int x) This works fine
{
  std::cout<<"Hello"<<std::endl;
}
BOOST_PYTHON_MODULE(hello_ext)
{
    using namespace boost::python;
    def("say_hello", say_hello);
}

我知道这个例子很傻,但我不应该在那里得到一个segfault,这是我能减少问题的最小的例子。也许我需要指定ndarray类型或维度数量,但我找不到任何相关文档。我一直在看这个,但好像没什么用。我的直觉是我错过了一些简单的东西,但我只是没有看到它。

当我运行这个:

In [1]: from hello_ext import *
In [2]: import numpy as np
In [3]: say_hello(np.array([3,4,5]))
Segmentation fault (core dumped)

我的Makefile。

PYTHON_VERSION = 2.7
PYTHON_INCLUDE = /usr/include/python$(PYTHON_VERSION)

BOOST_INC = /usr/include
BOOST_LIB = /usr/lib
TARGET = hello_ext
$(TARGET).so: $(TARGET).o
    g++ -std=c++11 -shared -Wl,--export-dynamic $(TARGET).o -L$(BOOST_LIB) -lboost_python -lboost_numpy -L/usr/lib/python$(PYTHON_VERSION)/config -lpython$(PYTHON_VERSION) -o $(TARGET).so
$(TARGET).o: $(TARGET).cpp
    g++ -std=c++11 -I$(PYTHON_INCLUDE) -I$(BOOST_INC) -fPIC -c $(TARGET).cp

我知道这很简单。我需要添加这两行:

Py_Initialize();
boost::numpy::initialize();

如上所述:如果不运行上述行,则在尝试使用boost::numpy::ndarray后会导致segfault。

因此:my file变成:
#include <iostream>
#include <boost/python.hpp>
#include <boost/numpy.hpp>

void say_hello(boost::numpy::ndarray& my_array)
//void say_hello(int x) This works fine
{
  std::cout<<"Hello"<<std::endl;
}
BOOST_PYTHON_MODULE(hello_ext)
{
    using namespace boost::python;
    Py_Initialize();
    boost::numpy::initialize();
    def("say_hello", say_hello);
}