Python C绑定错误

我用C代码编写了一个Python API,并将文件保存为foo.c.

码:

#include  #include  static PyObject *foo_add(PyObject *self, PyObject *args) { int a; int b; if (!PyArg_ParseTuple(args, "ii", &a, &b)) { return NULL; } return Py_BuildValue("i", a + b); } static PyMethodDef foo_methods[] = { { "add", (PyCFunction)foo_add, METH_VARARGS, NULL }, { NULL, NULL, 0, NULL } }; PyMODINIT_FUNC initfoo() { Py_InitModule3("foo", foo_methods, "My first extension module."); } 

当我尝试使用下面提到的命令编译时,我收到编译错误。

命令:gcc -shared -I / usr / include / python2.7 foo.c -o foo.so

错误:gcc -shared -I / usr / include / python2.7 foo.c -o foo.so / usr / bin / ld:/tmp/ccd6XiZp.o:在制作时无法使用针对`.rodata’的重定位R_X86_64_32共享对象; 使用-fPIC /tmp/ccd6XiZp.o重新编译:错误添加符号:错误值collect2:错误:ld返回1退出状态

如果我给出带有“-c”选项的编译命令,它会成功编译并创建目标文件foo.so(这是可执行文件)。

我必须创建一个目标文件(在编译命令中不使用-c选项)并在Python shell中导入它们以validation它。

请让我知道我在这里做错了什么。

在编译标志中,您应该包括-fPIC以编译为位置无关代码。 这是动态链接库所必需的。

例如

 gcc -c -fPIC foo.c -o foo.o gcc -shared foo.o -o foo 

或者只需一步

 gcc -shared -fPIC foo.c -o foo.so