2009-11-22 7 views
14

incluyen

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

Compilar y construir bienerror de importación en el programa hola impulso pitón

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

Pero cuando la importación de un lado pitón, ha obtenido un error.

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

¿Alguien me puede ayudar? Gracias por adelantado.

Respuesta

4

Oh, acabo de ver este post:

help needed with boost python

y problema resuelto

+7

¿Fue la solución para agregar "-lpython2.6 -lboost_python" a la línea de enlace? No está completamente claro para mí lo que aprendiste del otro hilo ... –

+0

@ChristopherBruns ¿Alguna vez obtuviste una solución para esto? – Tijme

13

Resuelto esto a través de "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 

hizo el truco para mí. Espero que esto sea lo más claro posible, ya que estaba luchando con esto durante aproximadamente media hora ahora;)

3

mismo que otro post aquí

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

pero quiero hacer hincapié en la importancia de la posición de " -lpython2.6 -lboost_python ". Si los coloca delante de los archivos de entrada (hello.o), de alguna manera se ignorarán (no se vincularán con el hello.so final). Esto es al menos cierto para g ++ (Ubuntu/Linaro 4.6.3-1ubuntu5).

para ser simple, http://ubuntuforums.org/showthread.php?t=496287 sugerido:

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

Según tengo entendido, la razón para la sensibilidad de orden de enlace es que el enlazador GNU 'ld' en tiempo de compilación es un enlazador de paso único: recoge símbolos para resolverlos de izquierda a derecha en la línea de comandos, y mantiene una lista de símbolos no resueltos, por lo que si 'hello.o' está al final, introduce nuevos símbolos no resueltos (que están definidos en' libpython2.6.so' y 'libboost_python.so'), pero no pueden ahora se resuelve porque no hay nada * a la derecha * que defina esos símbolos. – Emmet

1

que tenían el mismo problema y resultó que me estaba perdiendo un constructor de mi clase.

+0

Acabo de tener el mismo error, este era tan malditamente astuto !! Muchas gracias por este comentario, me podría haber tomado días hasta que noté esto –

Cuestiones relacionadas