2012-03-22 12 views
6

Quiero comenzar a aprender más sobre el uso de SWIG y otros métodos para interactuar con Python y C++. Para empezar, quería compilar este programa simple mencionado en another post:Intentando comprender el procedimiento de enlace para escribir Python/C++ hybrid

#include <Python.h> 

int main() 
{ 
     Py_Initialize(); 
     PyRun_SimpleString ("import sys; sys.path.insert(0, '/home/ely/Desktop/Python/C-Python/')"); 

     PyObject* pModule = NULL; 
     PyObject* pFunc = NULL; 

     pModule = PyImport_ImportModule("hello"); 
     if(pModule == NULL){ 
      printf("Error importing module."); 
      exit(-1); 
     } 


     pFunc = PyObject_GetAttrString(pModule, "Hello"); 
     PyEval_CallObject(pFunc, NULL); 
     Py_Finalize(); 
     return 0; 
} 

donde el archivo "hello.py" solo tiene el contenido:

def Hello(): 
    print "Hello world!" 

Nota: ya he python2 .7-dev y python-dev y libboost-python-dev instalados. Pero cuando voy a compilar el código, obtengo errores que creo que se deben a un enlace incorrecto a las bibliotecas de Python.

[email protected]:~/Desktop/Python/C-Python$ gcc -I/usr/include/python2.7 test.cpp /tmp/ccVnzwDp.o: In function `main': 
test.cpp:(.text+0x9): undefined reference to `Py_Initialize' 
test.cpp:(.text+0x23): undefined reference to `PyImport_ImportModule' 
test.cpp:(.text+0x58): undefined reference to `PyObject_GetAttrString' 
test.cpp:(.text+0x72): undefined reference to `PyEval_CallObjectWithKeywords' 
test.cpp:(.text+0x77): undefined reference to `Py_Finalize' 
/tmp/ccVnzwDp.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0' 
collect2: ld returned 1 exit status 

estaba pescando alrededor para ver ejemplos de esta línea, y me encontré con la siguiente sintaxis, lo que hace que el código para compilar en un archivo objeto, pero no soy capaz de ejecutar realmente el archivo.

[email protected]:~/Desktop/Python/C-Python$ gcc -c -g -I/usr/include/python2.7 test.cpp 
[email protected]:~/Desktop/Python/C-Python$ ./test.o 
bash: ./test.o: Permission denied 
[email protected]:~/Desktop/Python/C-Python$ chmod ug=rx ./test.o 
[email protected]:~/Desktop/Python/C-Python$ ./test.o 
bash: ./test.o: cannot execute binary file 
[email protected]:~/Desktop/Python/C-Python$ sudo chmod ug=rx ./test.o 
[email protected]:~/Desktop/Python/C-Python$ ./test.o 
bash: ./test.o: cannot execute binary file 

El mismo comportamiento que el anterior se sigue viendo si uso g++ en lugar de gcc.

La ayuda para entender mi error en la vinculación sería genial, y aún mejor para cualquier tipo de explicación que me ayude a entender la "lógica" detrás del tipo de enlace que necesito hacer, para que pueda recordar mejor lo que sea posible cosas que me olvido la próxima vez. ¡Gracias!

+1

Otra observación: no se pueden ejecutar archivos '.o' directamente. Primero necesita vincularlos en un ejecutable 'ELF'. – ulidtko

Respuesta

8

Lo que está viendo son errores del vinculador. Para solucionarlos, debe vincular la biblioteca python2.7.

probar la próxima línea:

gcc -I/usr/include/python2.7 test.c -lpython2.7 

que debería funcionar.

+1

¿Qué es 'kel.cpp'? ¿Debería reemplazarse con mi archivo de ejemplo 'test.cpp'? Si es así, entonces sigo recibiendo un error: 'ely @ AMDESK: ~/Escritorio/Python/C-Python $ gcc -I/usr/include/python2.7 test.cpp -lpython2.7' da el error : '/tmp/ccaahL1m.o:(.eh_frame+0x12): referencia no definida a' __gxx_personality_v0 ' collect2: ld devuelto 1 estado de salida' – ely

+0

@EMS Llamé al archivo kel.cpp. Solucionado en la edición. Es extraño que recibas un error. ¿Qué distribución estás usando? –

+1

@EMS, compilar con 'g ++' no 'gcc'. –

1

En primer lugar, ¿compila el código C o C++?

Utilice gcc para la primera y g++ para la segunda. El código de C++ necesita un enlace adicional para ser realizado.

Segundo: debe vincular su programa al libpython2.7.so para incrustar el intérprete en él. Para hacer esto, agregue -lpython2.7 a la línea de comando gcc.

1

test.o no es su archivo ejecutable, es por eso que no puede ejecutarlo.

El nombre predeterminado para su programa es a.out, intente ejecutar eso. Puede especificar un nombre para su programa usando la opción -o.

+1

... y quitar la opción '-c' comandos. – ulidtko

Cuestiones relacionadas