Сборка Cython, приводящая к неопределенному символу
У меня есть программа на C ++, которую я пытаюсь обернуть / преобразовать в Cython. Он использует определенную библиотеку, которая по некоторым причинам не приведет к рабочему модулю для импорта. Кстати, есть работающая программа на С ++. Вот setup.py:
ext_modules = [
Extension(
name="libnmfpy",
sources=["interface/nmf_lib.pyx"],
include_dirs = ["../src/", numpy.get_include()],
libraries=["nmf","mpi_cxx","mpi","m"],
library_dirs=["../build/Linux/bin.release","/usr/local/lib/","/usr/lib"],
language="c++",)
]
setup(
name = 'libnmfpy',
cmdclass = {'build_ext': build_ext},
ext_modules = ext_modules,
)
Я должен упомянуть, что именно libnmf вызывает проблемы. Первая сборка libnmf заставит этот скрипт сгенерировать эту ошибку:
/usr/bin/ld: ../build/Linux/bin.release/libnmf.a(nmf.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
../build/Linux/bin.release/libnmf.a: could not read symbols: Bad value
collect2: error: ld returned 1 exit status
Когда я перестраиваю libnmf с -fPIC, программа установки генерирует libnmfpy.so, но когда я импортирую это в другой скрипт, я получу вышеупомянутый неопределенный символ:
Traceback (most recent call last):
File "test.py", line 1, in <module>
import libnmfpy
ImportError: $path/cython/libnmfpy.so: undefined symbol: _ZN4elem6lapack3SVDEiiPdiS1_
Если это поможет, вот что мой поиск предложил:
nm libnmfpy.so | grep _ZN4elem6lapack3SVDEiiPdiS1_
U _ZN4elem6lapack3SVDEiiPdiS1_
nm ../build/Linux/bin.release/libnmf.a | grep _ZN4elem6lapack3SVDEiiPdiS1_
U _ZN4elem6lapack3SVDEiiPdiS1_
Что я и догадываюсь по причине ошибки. Я смотрю на то, что я считаю ошибочной библиотекой, на которой построен libnmf:
nm $another_path/lib/libelemental.a | grep _ZN4elem6lapack3SVDEiiPdiS1_
0000000000005290 T _ZN4elem6lapack3SVDEiiPdiS1_
Я еще не слишком знаком с библиотеками и компоновщиками, поэтому любая помощь будет принята с благодарностью. Спасибо
редактировать: небольшое копание заставило меня понять кое-что. Есть ли разница между Mac OS X и Linux, которую я должен остерегаться? Люди, на которых я работаю, изначально писали, что ошибок при сборке не было.