且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

试图理解用于编写Python / C ++混合的链接过程

更新时间:2022-10-14 18:23:10

您看到的是链接器错误。要修复这些问题,您需要链接 python2.7 库。



尝试下一行:

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

它应该可以工作。


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!

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.