更新时间: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 ofgcc
.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.