2011-06-15 36 views
0

我想使用鼠尾草來運行使用自定義C庫的基本Cython程序。鏈接到自定義C代碼的Cython

我有三個文件:hello.h,hello.c和cpy.spyx。

hello.h:

#include <stdio.h> 
void chello(); 

的hello.c:

#include "hello.h" 
void chello() { 
    printf("Hello world\n"); 
} 

cpy.spyx:

#cinclude /home/sage/sage 
cdef extern from "/home/sage/sage/hello.h": 
    void chello() 
def pyhello(): 
    chello() 

我試圖用鼠尾草來運行這個(只)命令:
加載「cpy.spyx」

我收到以下錯誤:
導入錯誤/ home/sage/sage // temp/...:undefined symbol:chello 這是我第一次嘗試Cython,所以我的代碼中可能有一個愚蠢的錯誤。另一種理論是,.h文件沒有被複制到上面的臨時目錄中。

感謝

+0

你需要通過聖人的方式?這看起來像一個有效的應該編譯沒有問題的cython程序。 – 2011-06-15 20:37:41

+0

由於'hw'沒有在你的C代碼中定義,也沒有在Cython代碼中引用,因此你看起來忘了重新編譯一些東西。 – 2011-06-15 20:49:01

+0

糟糕!我更改了示例的函數名稱,並忘記在我的錯誤消息中更改它。問題依然存在,但問題現在得到糾正。 – Eric 2011-06-15 21:20:03

回答

1

最後發現這裏的解決方案: http://trac.sagemath.org/sage_trac/ticket/1994

有一些顯然否​​則,無證指令。

使用相同的.c和.h文件上面,我用下面的.spyx文件:

#clang c 
#cfile hello.c 
#cinclude /home/sage/sage 
cdef extern from "/home/sage/sage/hello.h": 
    void chello() 
def pyhello(): 
    chello() 

注意的環節和我上面的代碼之間的區別:我不包括之後的空間#,並且我沒有在cinclude行的路徑中加引號。這是使用Sage的Cython hello世界程序的一個很好的例子。

我把所有三個文件(.c,.h和.spyx)放在/ home/sage/sage目錄中。然後我運行聖人並開始程序

load cpy.spyx 

沒有其他的步驟。