2011-06-15 33 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 

没有其他的步骤。