boost-python

boost python - error de importación boost_python: el módulo no define la función de inicio



boost-python (2)

El nombre utilizado en BOOST_PYTHON_MODULE debe coincidir con el nombre de la biblioteca .so que genere e importe en Python .

En primer lugar, miré las preguntas relacionadas, pero desafortunadamente no son muy útiles. Estoy tratando de envolver una enumeración y una clase de una biblioteca externa.

#include <Python.h> #include <boost/python.hpp> using namespace boost::python; #include <libvpsc/rectangle.h> using vpsc::Rectangle; using vpsc::Dim; BOOST_PYTHON_MODULE(adaptagrams) { enum_<Dim>("dim") .value("x", vpsc::XDIM) .value("y", vpsc::YDIM) .value("unset", vpsc::UNSET) ; class_<Rectangle>("Rectangle", init<double, double, double, double, optional<bool> >()) .add_property("centerX", &Rectangle::getCentreX) .add_property("centerY", &Rectangle::getCentreY) .add_property("width", &Rectangle::width, &Rectangle::set_width) .add_property("height", &Rectangle::height, &Rectangle::set_height) ; }

y compilar con:

g++ -fPIC -I/usr/include/python2.7 -c adaptagrams.cpp -o adaptagrams.o g++ -shared -Wl,-soname,adaptagrams.so -o adaptagrams.so adaptagrams.o -lpython2.7 -lboost_python -lvpsc

Sin embargo, cuando intento importar el módulo .so, aparece un error:

ImportError: dynamic module does not define init function (PyInit_adaptagrams)

¿Algunas ideas?

Actualización: cuando reinicio Python y trato de importar, el primer error que recibo es:

ImportError: ./adaptagrams.so: undefined symbol: _ZN8topology13computeStressERKSt6vectorIPNS_4EdgeESaIS2_EE

Cuando lo vuelvo a intentar, el segundo es la importación dinámica desde arriba (2.7) y un segfault (3.2). Boost se compila contra 2.7 y 3.2 y estoy vinculando a los correctos en cada enfoque.

Actualización 2: el código del tutorial de la página boost_python funciona:

#include <Python.h> #include <boost/python.hpp> using namespace boost::python; struct Hello { Hello(std::string msg): msg(msg) {} void set(std::string msg) { this->msg = msg; } std::string greet() { return msg; } std::string msg; }; BOOST_PYTHON_MODULE(constructor) { class_<Hello>("Hello", init<std::string>()) .def("greet", &Hello::greet) .def("set", &Hello::set) ; }

Misma compilación

g++ -fPIC -I/usr/include/python2.7 -c constructor.cpp -o constructor.o g++ -shared -Wl,-soname,constructor.so -o constructor.so constructor.o -lpython2.7 -lboost_python


He visto esta excepción antes. Lo obtuve usando Visual Studio en Windows, así que las cosas podrían ser un poco diferentes en la tierra de Unix-oid pero:

Dos posibilidades:

Debug / Release miss-match: está intentando importar una compilación de depuración de su módulo en una compilación de lanzamiento de python (o viceversa). La solución es incluir boost/python/detail/wrap_python.hpp lugar de Python.h . Esto solucionará algunos elementos incluidos y definidos para que sea posible hacer lo que desea.

Python / Boost.Python versión falta de coincidencia: Boost.Python se compila contra una versión específica de python. Lo estás usando con una versión diferente. Por ejemplo: parece que estás usando python 2.7. Su biblioteca boost_python podría compilarse contra Python 2.6. Sí, esto significa que su módulo solo puede funcionar con una versión de python a la vez.