Python C绑定错误
Python C binding error
我用C代码写了一个Python API并保存为foo.c.
代码:
#include <Python.h>
#include <stdio.h>
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: 重定位 R_X86_64_32 对 `.rodata' 不能在创建共享对象时使用;使用 -fPIC 重新编译
/tmp/ccd6XiZp.o: 添加符号时出错:错误值
collect2:错误:ld 返回了 1 个退出状态
如果我给编译命令加上“-c”选项,它会成功编译并创建目标文件foo.so(这是可执行文件)。
我必须创建一个目标文件(不在编译命令中使用 -c 选项)并将它们导入 Python shell 以验证它。
请告诉我我做错了什么。
在您的编译标志中,您应该包含 -fPIC 以编译为与位置无关的代码。这是动态链接库所必需的。
例如
gcc -c -fPIC foo.c -o foo.o
gcc -shared foo.o -o foo
或一步到位
gcc -shared -fPIC foo.c -o foo.so
我用C代码写了一个Python API并保存为foo.c.
代码:
#include <Python.h>
#include <stdio.h>
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: 重定位 R_X86_64_32 对 `.rodata' 不能在创建共享对象时使用;使用 -fPIC 重新编译 /tmp/ccd6XiZp.o: 添加符号时出错:错误值 collect2:错误:ld 返回了 1 个退出状态
如果我给编译命令加上“-c”选项,它会成功编译并创建目标文件foo.so(这是可执行文件)。
我必须创建一个目标文件(不在编译命令中使用 -c 选项)并将它们导入 Python shell 以验证它。
请告诉我我做错了什么。
在您的编译标志中,您应该包含 -fPIC 以编译为与位置无关的代码。这是动态链接库所必需的。
例如
gcc -c -fPIC foo.c -o foo.o
gcc -shared foo.o -o foo
或一步到位
gcc -shared -fPIC foo.c -o foo.so