Cython Cimport无法解析的外部符号

时间:2019-03-02 16:52:15

标签: python cython

我的setup.py是:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
import numpy as np

extensions = [
    Extension('_hmmc', ['_hmmc.pyx'], include_dirs = [np.get_include()]),
    ]

setup(
    ext_modules = cythonize(extensions)
    )

我正在尝试使用cimport使其工作。

from numpy.math cimport expl

import numpy as np
print(expl(5-2))

但是,错误是

  

错误LNK2001:无法解析的外部符号_npy_expl

有什么主意吗?我检查了我的cython / includes / numpy / math.pxd是否具有以下内容:

  

long double expl“ npy_expl”(long double x)

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

可能为了简单起见,可以使用标准库中的exp,否则可能会遇到麻烦,以使其与npy_expl一起使用。

通常的Numpy-API是仅标头的,但数学函数不是这种情况。有定义的NPY_INLINE_MATH,它也将numpy的数学库显示为内联函数,但是这在已安装的numpy-distributionen上不起作用,因为它们缺少core/src文件夹,其中数学函数的定义给出了。

因此,您必须将预编译的static numpy's math library添加到设置中。可以在文件夹core/lib中找到它,并至少在linux上称为libnpymath.a

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
import numpy as np

import os
npymath_path = os.path.join(os.path.dirname(np.get_include()), 'lib')

extensions = [
    Extension('_hmmc', ['_hmmc.pyx'], 
               include_dirs = [np.get_include()],
               libraries = ['npymath'],
               library_dirs=[npymath_path]
               ),
    ]

setup(
    ext_modules = cythonize(extensions)
    )

我不知道有一种更好的方法来获取npymath_pathget_mathlibs中有一个函数numpy.distutils.misc_util,但仅在_numpyconfig.h才有效至少在我的安装中。