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.
Debe contestar por sí mismo y aceptar su propia respuesta. – moooeeeep