boost_python importation d'erreur: le module ne permet pas de définir la fonction init
Tout d'abord: j'ai regardé les questions connexes, mais ils ne sont pas très utile, malheureusement. Je suis d'essayer d'envelopper un enum et une classe à partir d'une bibliothèque externe.
#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)
;
}
et compiler avec:
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
Cependant, lorsque j'essaie d'importer le .donc, module, j'obtiens une erreur:
ImportError: dynamic module does not define init function (PyInit_adaptagrams)
Des idées?
Mise à jour: Quand je redémarre Python et essayer l'importation, la première erreur que je reçois est:
ImportError: ./adaptagrams.so: undefined symbol: _ZN8topology13computeStressERKSt6vectorIPNS_4EdgeESaIS2_EE
Quand je l'ai essayer à nouveau, le 2ème est la dynamique de l'importation à partir de ci-dessus (2.7) et une erreur de segmentation (3.2). Boost est compilé à la fois contre 2,7 et 3,2 et je suis les liens entre le droit sur chaque approche.
Mise à jour 2: Le tutoriel code de la boost_python page fonctionne:
#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)
;
}
Même compilation:
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
OriginalL'auteur Michael Schubert | 2011-12-06
Vous devez vous connecter pour publier un commentaire.
Le nom utilisé dans
BOOST_PYTHON_MODULE
doit correspondre au nom de la.so
bibliothèque de générer et de les importer dans python.savez-vous où dans la documentation ce qui est indiqué?
Intéressant: j'ai eu à faire
BOOST_PYTHON_MODULE(libhello)
alors que mon CMake paramètres appelé ma bibliothèque "bonjour". Cela semble entrer en conflit avec le coup de pouce.Python docs.La raison pour cela est que cmake généralement ajoute "lib". Ceci peut être modifié lorsque vous définissez les propriétés de la bibliothèque de la cible, plus particulièrement lorsque vous modifiez le PREFIX de la propriété.
OriginalL'auteur jgoeders
J'ai vu cette exception avant. Je l'ai eu à l'aide de Visual Studio sous windows, donc les choses peuvent être un peu différentes dans unix-oid de la terre, mais:
Deux Possibilités:
Debug/Release miss-match:
Vous essayez d'importer une version de débogage de votre module dans une version release de python (ou vice-versa). La solution consiste à inclure
boost/python/detail/wrap_python.hpp
au lieu dePython.h
. Cela permettra de résoudre certains inclut et définit pour le rendre possible de faire ce que vous voulez.Python/Boost.Une version de Python miss-match:
Coup de pouce.Python est compilé avec une version spécifique de python. Vous l'utilisez avec une version différente. Par exemple: vous semblez être à l'aide de python 2.7. Votre boost_python bibliothèque peut être compilé avec la version 2.6 de python. Oui, cela signifie que votre module ne fonctionne qu'avec une version de python à la fois.
Ah, alors il doit être quelque chose d'autre. Je ne peux pas vraiment vous aider. Je suggère de regarder à l'éditeur de liens type de choses.
Et maintenant, je vois ci-dessous que vous avez fait et que vous avez fixé.
OriginalL'auteur Matthew Scouten