同一个c库

时间:2018-04-13 18:38:50

标签: c cython gmp

我想使用sage和外部c库。外部库已经有用cython编写的python绑定,并处理python&#39的数字类和gmp整数之间的转换。

为了适应这种情况,我想绕过那种转换:sage整数已经在引擎盖下使用了gmp。但为了使我的代码编译(和工作),我在任何地方使用显式类型转换,我认为应该有更好的方法来做到这一点。如果我可以把我想要上游的代码放到最后,那就最终了。

在sage中,整数类型(mpz_t)的gmp绑定在pxd文件中声明:

ctypedef struct __mpz_struct:
    int _mp_alloc
    int _mp_size
    mp_ptr _mp_d

ctypedef __mpz_struct mpz_t[1]

但外部库对gmp有自己的pxd并声明:

ctypedef struct mpz_t:
    pass

sage.mpz_tmylib.mpz_t之间手动转换我的代码工作正常,但是将mylib的绑定重写为使用sage的gmp绑定会好得多而不是自己的?我想是的,但是怎么样?

gmp中的功能签名之间也存在不一致,例如在圣人:

void mpz_set (mpz_t rop, mpz_t op)

但是在mylib中,会出现一个狂野的const

void mpz_set(mpz_t rop, const mpz_t op)

我有一个暗示,sage和mylib之间的区别在于mylib将mpz_t视为不透明的结构,但是sage深入研究了实现。我对低级别C没有真正的经验,所以对我可以用来教育自己的材料的任何参考都将不胜感激。

1 个答案:

答案 0 :(得分:1)

签名的差异不是你需要担心的 - 对于cdef extern声明,Cython只需知道足以正确调用C代码。因此,const的存在与否对Cython几乎没有影响。同样,如果你不在Cython中使用它们,则没有必要声明struct中的所有字段。

如果您准备更改“mylib”代码以使用sage声明,那么这很容易 - 只需使用cimport即可。我相信正确的导入应该是

from sage.libs.gmp.types cimport mpz_t

(这依赖于Python路径上安装的sage .pxd文件。)对你想要使用的函数做类似的事情。