title: Trying to understand linking procedure for writing Python/C++ hybrid
body: <p>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 <a href="https://stackoverflow.com/questions/9824949/how-to-solve-the-segmentation-fault-when-hybrid-programming-of-c-python">another post</a>:</p>
  
  <pre><code>#include &lt;Python.h&gt; 
  
   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; 
   }
  </code></pre>
  
  <p>where the file "hello.py" just has the contents:</p>
  
  <pre><code> def Hello():
       print "Hello world!"
  </code></pre>
  
  <p><strong>Note:</strong> 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.</p>
  
  <pre><code> 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
  </code></pre>
  
  <p>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.</p>
  
  <pre><code> 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
  </code></pre>
  
  <p>The same behavior as above is still seen if I use <code>g++</code> instead of <code>gcc</code>.</p>
  
  <p>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!</p>