2

在 Cython 中使用 mlpack 时遇到了“未定义符号”的问题。这是我的测试用例:

cdef extern from "<mlpack/core.hpp>" namespace "arma":
    ctypedef unsigned uword

    cdef cppclass vec:
        vec()
        vec(uword)

    cdef cppclass mat:
        mat()
        mat(uword, uword)
        void matprint "print" ()
        double& operator() (const uword, const uword)

cdef extern from "<mlpack/methods/pca/pca.hpp>" namespace "mlpack::pca":
    cdef cppclass ExactSVDPolicy:
        ExactSVDPolicy()

    cdef cppclass PCA[ExactSVDPolicy]:
        PCA()
        void Apply(const mat&, mat&, vec&, mat&)


cdef mat m = mat(4, 2)
(<double*>&m(0, 0))[0] = 1.2
(<double*>&m(1, 0))[0] = 1.0
(<double*>&m(2, 0))[0] = 0.8
(<double*>&m(3, 0))[0] = 0.6 
(<double*>&m(0, 1))[0] = 0.6
(<double*>&m(1, 1))[0] = 0.8
(<double*>&m(2, 1))[0] = 1.0
(<double*>&m(3, 1))[0] = 1.2

cdef vec eig = vec(2)
cdef mat coeff = mat(4, 2)
cdef PCA[ExactSVDPolicy] pca

m.matprint()
pca.Apply(m, m, eig, coeff)
m.matprint()

这是设置文件:

from distutils.core import setup
from Cython.Build import cythonize
from distutils.extension import Extension

setup(ext_modules = cythonize([Extension("pca", ["pca.pyx"], language='c++')]))

编译没问题,但是当我导入模块时,python 抱怨:

undefined symbol: _ZN6mlpack5Timer5StartERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE

我查找了符号,它在 libmlpack.so 中定义。我把它放在 /usr/local/lib 中,它包含在 LD_LIBRARY_PATH 中,但似乎 Python 在运行时找不到该符号。有没有人可以帮忙?谢谢。

4

1 回答 1

1

扩展必须链接到它正在使用的库。

setup(ext_modules=cythonize([Extension(
    "pca", ["pca.pyx"], language='c++'),
    libraries='mlpack',
]))

可以通过 . 检查是否可以找到所有符号以及正确链接的库ldd <.so>

请参阅编译和链接Cython 文档。

于 2018-04-11T15:03:32.060 回答