使用boost::numpy::ndarray时出现段错误

11 投票
1 回答
1781 浏览
提问于 2025-04-18 13:06

我在尝试把 boost::numpy::ndarray 作为参数传递时,遇到了我认为很奇怪的段错误(seg fault)。

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

}

我知道这个例子看起来有点傻,但我在这里不应该出现段错误,这是我能缩减到的最小示例。也许我需要指定 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

1 个回答

11

我知道这其实很简单。我需要添加这两行代码:

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

正如这里所解释的:这里,如果不运行上面的代码,任何尝试使用 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;
    Py_Initialize();
    boost::numpy::initialize();
    def("say_hello", say_hello);
}

撰写回答