2014-11-23 28 views
0

我正在寫一些cython代碼,並且遇到了一個奇怪的問題。當我嘗試將一個對象直接從python傳遞給C作爲一個結構體時,cython生成的代碼很好,但是gcc不喜歡代碼輸出並給出了以下錯誤:error: declaration does not declare anything。這裏是我的測試代碼:Cython錯誤:聲明不聲明任何東西

// 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 *); 

... 

我使用cython 0.21直接來自Anaconda和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?

回答

2

是的,我想你是對的,這是Cython 0.21中的一個bug。首先,用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)此工作完美無缺,您提供的cythongcc命令沒有任何錯誤。使用0.21版本,我可以重現您看到的錯誤。

運行git bisect表明該錯誤似乎在提交fd56551中得到解決。這是在0.21.1之後(此時是最新版本),所以升級到這個版本並不能修復這個bug。看來你必須去開發分支或等待下一個Cython版本。

+0

好極了。謝謝你的幫助! – jeremy 2014-11-23 22:06:02