【问题标题】:Python C binding errorPython C 绑定错误
【发布时间】:2015-02-14 00:44:08
【问题描述】:

我用 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 以验证它。

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

【问题讨论】:

  • 当你编译你的 c 文件时,使用 -fPIC 和 -c 来编译为与位置无关的代码。根据共享库的要求。
  • 对保罗有效。非常感谢您的意见。编译命令:gcc -shared -I/usr/include/python2.7 -fPIC foo.c -o foo.so

标签: python c gcc binding


【解决方案1】:

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

例如

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

或一步完成

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

【讨论】:

  • 是的,保罗你是对的。当我使用 -fPIC 选项编译时,它已成功完成。我能够在 Python shell 中导入模块并按预期执行。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2017-11-06
  • 2011-06-27
  • 2017-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
  • 2015-03-28
相关资源
最近更新 更多