2012-02-04 11 views
6

Por lo tanto, busco una buena herramienta para integrar mi código C++ con python, y al principio miré en boost.python.C++ Boost.Python: 2 problemas

He recibido hola de la documentación de refuerzo e intento compilarla y ejecutarla. El código fuente es (src/hello.cpp):

#include <Python.h> 
#include <boost/python.hpp> 

char const* greet() 
{ 
    return "hello, world"; 
} 

BOOST_PYTHON_MODULE(hello_ext) 
{ 
    using namespace boost::python; 
    def("greet", greet); 
} 

Problema 1 - Windows y MinGW

trato de construir y mi resultado:

g++ -o build\hello.o -c -IE:\Programming\libs\boost_1_48_0 -IE:\Programming\Python\include src\hello.cpp 
g++ -shared -o pyhello.dll build\hello.o -LE:\Programming\libs\boost_1_48_0\stage\lib -LE:\Programming\Python\libs -lboost_python-mgw45-mt-1_48 -lpython27 -Wl,--out-implib,libpyhello.a 
Creating library file: libpyhello.a 
build\hello.o:hello.cpp:(.text+0x20): undefined reference to `_imp___ZN5boost6python6detail11init_moduleEPKcPFvvE' 

también similares 4 errores no definidos con boost :: python.

Mi impulso de construcción de línea de comandos: bjam toolset=gcc variant=release

He encontrado problemas similares en Google (y en stackoverflow también), pero no encontró respuesta en mi caso.

Problema 2 - Usando el modulo (Linux)

En la plataforma Linux no tengo problema con el módulo de construcción, misma fuente compilado así:

g++ -o build/hello.os -c -fPIC -I/usr/include/python2.7 src/hello.cpp 
g++ -o libpyhello.so -shared build/hello.os -lboost_python -lpython2.7 

Ahora, ¿cómo puedo usar eso? En la documentación no hay palabras sobre nombramiento módulo, cita:

puede estar expuesto a Python escribiendo un envoltorio Boost.Python:

#include <boost/python.hpp> 

BOOST_PYTHON_MODULE(hello_ext) 
{ 
    using namespace boost::python; 
    def("greet", greet); 
} 

Eso es todo. Hemos terminado. Ahora podemos construir esto como una biblioteca compartida. La DLL resultante ahora es visible para Python. Esto es una muestra de Python sesión:

>>> import hello_ext 
>>> print hello_ext.greet() 
hello, world 

lo tanto, mi módulo denominado: libpyhello.so, pero ¿cómo lo puedo usar en iterpreter pitón? Trato pyhello importación, hello_ext, libpyhello - y sólo con libpyhello intérprete se imprime:

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

Todas las demás variantes de importación ha fallado con: ImportError: No module named pyhello

ACTUALIZACIÓN segunda pregunta: Resuelto, * .so módulo debe ser nombrado como ID utilizado en BOOST_PYTHON_MODULE. Después de cambiar: BOOST_PYTHON_MODULE(hello_ext) a BOOST_PYTHON_MODULE(libpyhello), el módulo se importa bien como libpyhello.

+0

Debe contestar por sí mismo y aceptar su propia respuesta. – moooeeeep

Respuesta

3

Hola, tengo el mismo problema que el suyo bajo win7 32bit con mingw, sin embargo lo arreglé al fin.

La solución posible es:

Al construir el pitón impulso lib, utilizan link = compartida en su lugar.

como:

bjam stage toolset=gcc --with-python link=shared threading=multi runtime-link=shared variant=release,debug --user-config=user-config.jam cxxflags="-include cmath " 

Cuando enlace, utilice la macro BOOST_PYTHON_STATIC_LIB explícitamente

La siguiente es la muestra cmd línea:

g++ hello_ext.cpp -shared -O3 -DBOOST_PYTHON_STATIC_LIB -lboost_python -lpython25 -o hello_ext.pyd 

Para ahorrar tiempo, sólo tiene que añadir algunas líneas en el archivo boost\python.hpp:

#include <cmath> //fix cmath:1096:11: error: '::hypot' has not been declared 
#if defined(__MINGW32__) && defined(_WIN32) 
#if !defined(BOOST_PYTHON_SOURCE) 
#define BOOST_PYTHON_STATIC_LIB 
#endif 
#endif 
... here,other includes files ... 

A continuación, puede simplemente usar cmd así:

g++ hello_ext.cpp -shared -lboost_python -lpython25 -o hello_ext.pyd 

Esta concha va a estar bien, tener una oportunidad.

4

Es importante que el archivo de la biblioteca lleva el nombre como se declara el módulo aquí:

BOOST_PYTHON_MODULE(hello_ext) 

que es hello_ext.dll o hello_ext.so.

+0

Este era mi problema, mi .so tenía el prefijo '_' y mi llamada BOOST_PYTHON_MODULE no. ¡Gracias! –

+0

Tengo el mismo problema solamente, que tener el nombre del módulo igual que el nombre de la libra no parece resolver el problema. ¿Alguna otra idea? Cuando ejecuté nm en la lib, no veo muchos símbolos dentro de ella, ¿quizás Python necesita que todo esté enlazado? –

+0

@MaxShifrin Tal vez necesites postear otra pregunta. Si lo hace, agregue detalles sobre por qué las respuestas dadas aquí no funcionan ni se aplican a su problema. – moooeeeep

Cuestiones relacionadas