python — неопределенный символ в модуле Cython при использовании mlpack

Я столкнулся с проблемой «неопределенный символ» при использовании mlpack в Cython. Вот мой тестовый пример:

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 не находит символ во время выполнения. Есть кто-нибудь, кто может помочь? Благодарю.

1

Решение

Расширение должно быть связано с используемой библиотекой.

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

То, что все символы могут быть найдены, а библиотеки правильно связаны, могут быть проверены ldd <.so>,

Увидеть Компиляция и связывание Документация Cython.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]