Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Trying to understand linking procedure for writing Python/C++ hybrid

Tags:

c++

python

I want to start learning more about using SWIG and other methods to interface Python and C++. To get started, I wanted to compile this simple program mentioned in another post:

#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; 
 }

where the file "hello.py" just has the contents:

 def Hello():
     print "Hello world!"

Note: I already have python2.7-dev and python-dev and libboost-python-dev installed. But when I go to compile the code, I get errors that I believe are due to incorrectly linking to the Python libraries.

 ely@AMDESK:~/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

I was fishing around for examples of this online, and I found the following syntax, which causes the code to compile into an object file, but then I am unable to actually execute the file.

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

The same behavior as above is still seen if I use g++ instead of gcc.

Help in understanding my error in linking would be great, and even better for any sort of explanation that helps me understand the "logic" behind the kind of linking I need to do, so that I'll remember better what possible things I am forgetting the next time. Thanks!

like image 599
ely Avatar asked Mar 22 '12 16:03

ely


1 Answers

What you are seeing are linker errors. To fix those, you need to link python2.7 library.

Try next line :

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

it should work.

like image 167
BЈовић Avatar answered Nov 09 '22 05:11

BЈовић