Cython错误:声明没有声明任何内容

时间:2014-11-23 11:31:17

标签: python c++ cython

我正在编写一些cython代码,而且我遇到了一个奇怪的问题。当我尝试将一个对象从python直接传递给C作为结构时,cython生成的代码很好,但是gcc不喜欢代码输出并给出了以下错误:error: declaration does not declare anything。这是我的测试代码:

// cake.h
using Cake = struct CakeStruct {
    int a, b, c;
};

void bake(Cake batter);

和cython:

# test.pyx

cdef extern from "cake.h":
    void bake(Cake batter)
    ctypedef struct Cake:
        int a
        int b
        int c

def make_one(batter):
    cdef Cake more_batter;
    more_batter.a = 5
    more_batter.b = 10
    print(more_batter.a + more_batter.b)

    bake(more_batter)
    bake(batter)  # <- this line generates bad code

如果查看生成的代码,坏行看起来像这样:

...

Cake; // this is the error
static Cake __pyx_convert__from_py_Cake(PyObject *);

...

我直接使用Anaconda的cython 0.21和Ubuntu 14.04附带的gcc 4.8.2。使用cython --cplus test.pyx生成Cython代码,并通过以下方式检查语法:

gcc -std=c++11 -fsyntax-only -I`...python include dir...` test.cpp

-

任何人都可以在我的.pyx文件中告诉我我做错了什么吗?或者这是我绊倒的一个cython bug?

1 个答案:

答案 0 :(得分:2)

是的,我认为你是对的,这是Cython 0.21中的一个错误。首先,使用Cython 0.20进行测试(因为这是我的Linux发行版),它给了我

cake.pyx:16:15: Cannot convert Python object to 'Cake'

我想这是因为转换功能在0.20中丢失或不完整,虽然我在发布说明中找不到任何关于此的内容(https://github.com/cython/cython/blob/master/CHANGES.rst)。

接下来,我使用Github存储库(https://github.com/cython/cython)中的master分支进行测试。这非常有效,没有来自您提供的cythongcc命令的错误。使用0.21版本,我可以重现您看到的错误。

运行git bisect表示该错误似乎已在提交fd56551中修复。这是在0.21.1(此时的最新版本)之后,因此升级到此版本不会修复该错误。您似乎必须使用开发分支或等待下一个Cython版本。