2009-11-22 3 views
14

comprennent

using namespace boost::python; 

struct World{ 
    void set(std::string msg) { this->msg = msg; } 
    std::string greet() { return msg; } 
    std::string msg; 
}; 

BOOST_PYTHON_MODULE(hello) 
{ 
    class_<World>("World") 
     .def("greet", &World::greet) 
     .def("set", &World::set) 
    ; 
} 

Compile et construire okErreur d'importation sur le programme python boost bonjour

~/boost$ g++ -fPIC -I/usr/include/python2.6 -c hello.cpp 
~/boost$ g++ -shared hello.o -o hello.so 

Mais quand l'importation d'un côté python, a erreur.

>>> import hello.so 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: ./hello.so: undefined symbol: _ZNK5boost6python7objects21py_function_impl_base9max_arityEv 
>>> 

Quelqu'un peut-il m'aider? Merci d'avance.

Répondre

4

Oh, je viens de voir ce post:

help needed with boost python

et problème résolu

+7

était donc la solution d'ajouter « -lpython2.6 -lboost_python » à la ligne de lien? Il est pas tout à fait clair pour moi ce que vous avez appris de l'autre fil ... –

+0

@ChristopherBruns Avez-vous jamais obtenir une solution pour cela? – Tijme

13

résolu ce problème via "No such file or directory" error with Boost Python

g++ -c -fPIC hello.cpp -o hello.o 
g++ -shared -Wl,-soname,hello.so -o hello.so hello.o -lpython2.6 -lboost_python 

a fait l'affaire pour moi. J'espère que cela est aussi clair que possible que je luttais avec cela pendant environ une demi-heure maintenant;)

3

même que d'autres post ici

g++ -c -fPIC hello.cpp -o hello.o 
g++ -shared -Wl,-soname,hello.so -o hello.so hello.o -lpython2.6 -lboost_python 

Mais je tiens à souligner l'importance de la position " -lpython2.6 -lboost_python ". Si vous les mettez en face de fichiers d'entrée (hello.o), ils seront en quelque sorte ignoré (non lié au hello.so final). C'est au moins vrai pour g ++ (Ubuntu/Linaro 4.6.3-1ubuntu5).

Pour être simple, http://ubuntuforums.org/showthread.php?t=496287 suggéré:

g++ <.cpp or .o file(s)> [LDFLAGS] [LIBS] -o [appname] 
+3

Si je comprends bien, la raison de la sensibilité lien d'ordre est que la GNU 'ld' la compilation de liaison est un éditeur de liens en un seul passage: il ramasse des symboles pour résoudre de gauche à droite sur la ligne de commande, et maintient une liste des symboles non résolus, donc si 'hello.o' est à la fin, il introduit de nouveaux symboles non résolus (qui sont définis dans' 'libpython2.6.so' et libboost_python.so'), mais ils ne peuvent pas maintenant être résolu parce qu'il n'y a rien * à droite * qui définit ces symboles. – Emmet

1

J'ai eu le même problème et il est apparu que je manquais un constructeur de ma classe.

+0

juste eu la même erreur, celui-ci était si sanglante sournoise !! Merci beaucoup pour cette remarque, ça aurait pu me prendre des jours jusqu'à ce que je remarque ça –