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!
Otra observación: no se pueden ejecutar archivos '.o' directamente. Primero necesita vincularlos en un ejecutable 'ELF'. – ulidtko