2014-07-13 20 views
7

Tôi nhận được những gì tôi nghĩ là một lỗi seg lạ khi tôi đang cố gắng để vượt qua boost::numpy::ndarray như một cuộc tranh cãi:Segmentation lỗi khi sử dụng tăng :: 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); 

} 

Tôi biết ví dụ này là ngớ ngẩn, nhưng tôi không nên nhận được một lỗi seg ở đó, và đây là ví dụ nhỏ nhất tôi đã có thể làm giảm vấn đề. Có lẽ tôi cần phải chỉ định loại ndarray hoặc số thứ nguyên, nhưng tôi không thể tìm thấy bất kỳ tài liệu nào về nó. Tôi đang xem this, nhưng có vẻ như không hữu ích lắm. Cảm giác ruột của tôi là tôi thiếu cái gì đó đơn giản, nhưng tôi không thấy nó.

Khi tôi chạy này:

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 của tôi:

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 

Trả lời

5

Tôi biết đó là một cái gì đó đơn giản. Tôi cần thêm hai dòng sau:

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

như đã giải thích: here kết quả lỗi seg sau khi mọi nỗ lực để sử dụng boost::numpy::ndarray nếu dòng trên không chạy.

Do đó: tập tin của tôi trở thành:

#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); 
} 
+0

Nhưng trong ví dụ liên kết, các initialisation được thực hiện trong một C++ 'main() '. Ở đây, chúng ta đang ở trong một mô-đun python. – Walter

Các vấn đề liên quan