尝试使用GCC编译Cython输出时出错

时间:2015-03-26 18:02:28

标签: python gcc cython

我正在尝试使用GCC将Cython3文件编译为可执行文件。 目前我仍然坚持一个简单的“你好世界”:

# -*- coding: utf-8 -*-
if __name__ == "__main__":
    print("Hello World !")

这是我为了编译这个简单的程序而试图执行的命令:

cython3 test.pyx
gcc -I/usr/include/python3.4 test.c

第一个命令正确运行,但这是我输入第二个命令时得到的结果:

cython.c:422:14: error: conflicting types for ‘PyTypeObject’
 typedef void PyTypeObject;
              ^
In file included from /usr/include/python3.4/pytime.h:6:0,
                 from /usr/include/python3.4/Python.h:65,
                 from cython.c:16:
/usr/include/python3.4/object.h:422:3: note: previous declaration of ‘PyTypeObject’ was here
 } PyTypeObject;
   ^
cython.c: In function ‘__Pyx_PyObject_GetAttrStr’:
cython.c:488:18: warning: dereferencing ‘void *’ pointer
     if (likely(tp->tp_getattro))
                  ^
cython.c:399:43: note: in definition of macro ‘likely’
   #define likely(x)   __builtin_expect(!!(x), 1)
                                           ^
cython.c:488:18: error: request for member ‘tp_getattro’ in something not a structure or union
     if (likely(tp->tp_getattro))
                  ^
cython.c:399:43: note: in definition of macro ‘likely’
   #define likely(x)   __builtin_expect(!!(x), 1)
                                           ^
cython.c:489:18: warning: dereferencing ‘void *’ pointer
         return tp->tp_getattro(obj, attr_name);
                  ^
cython.c:489:18: error: request for member ‘tp_getattro’ in something not a structure or union

我目前正在进行Debian测试,因此我有以下版本的Python和Cython:

Python: 3.4.2-2
Cython: 0.21.1-1

2 个答案:

答案 0 :(得分:1)

使用以下命令解决问题:

cython3 test.pyx
gcc -I/usr/include/python3.4m test.c -lpython3.4m

答案 1 :(得分:0)

我怀疑你的答案解决了这个问题。

您最初的问题是,该扩展程序名为cython.pyx(考虑到this post)。

但是,不允许命名你的cython-module" cython"因为它是Cython的一个特殊名称,导致生成的c文件无法编译(无论出于何种原因插入了伪typedef void PyTypeObject;)。不幸的是,cython没有报告此案例的错误。

将pyx-file / extension从cython.pyx重命名为test.pyx解决了这个问题。