Voglio iniziare a imparare di più sull'utilizzo di SWIG e altri metodi per interfacciare Python e C++. Per iniziare, ho voluto compilare questo semplice programma di cui al another post:Tentativo di comprendere la procedura di collegamento per scrivere l'ibrido Python/C++
#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;
}
in cui il file "hello.py" ha appena il contenuto:
def Hello():
print "Hello world!"
Nota: ho già python2 .7-dev e python-dev e libboost-python-dev installati. Ma quando vado a compilare il codice, ottengo errori che credo siano dovuti al collegamento errato alle librerie 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
Stavo pescando in giro per gli esempi di questo in linea, e ho trovato la seguente sintassi, che fa sì che il codice per compilare in un file oggetto, ma poi non sono in grado di eseguire effettivamente il file.
[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
Lo stesso comportamento come sopra si vede ancora se uso g++
anziché gcc
.
Aiutare a capire il mio errore nel collegamento sarebbe grande, e ancora meglio per qualsiasi tipo di spiegazione che mi aiuti a capire la "logica" dietro il tipo di collegamento che devo fare, in modo che ricorderò meglio ciò che è possibile cose che sto dimenticando la prossima volta. Grazie!
Un'altra osservazione: non è possibile eseguire direttamente i file '.o'. Per prima cosa è necessario collegarli a un eseguibile 'ELF'. – ulidtko