Generación de Cython que resulta en un símbolo indefinido

Tengo un progtwig en C ++ que estoy tratando de envolver / convertir a Cython. Utiliza una biblioteca particular que, por alguna razón, no dará como resultado un módulo de trabajo para importar. Hay un progtwig de trabajo de c ++, por cierto. Aquí está el 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, ) 

Debo mencionar que es libnmf que parece estar causando problemas. La primera comstackción de libnmf causaría que este script genere este error:

 /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 

Cuando reconstruyo libnmf con -fPIC, la configuración genera un libnmfpy.so, pero cuando lo importo en otra secuencia de comandos, obtendré el símbolo indefinido mencionado anteriormente:

 Traceback (most recent call last): File "test.py", line 1, in  import libnmfpy ImportError: $path/cython/libnmfpy.so: undefined symbol: _ZN4elem6lapack3SVDEiiPdiS1_ 

Si ayudaría, aquí hay algo que mi búsqueda sugirió:

 nm libnmfpy.so | grep _ZN4elem6lapack3SVDEiiPdiS1_ U _ZN4elem6lapack3SVDEiiPdiS1_ nm ../build/Linux/bin.release/libnmf.a | grep _ZN4elem6lapack3SVDEiiPdiS1_ U _ZN4elem6lapack3SVDEiiPdiS1_ 

Que es lo que supongo a la causa del error. Miro en lo que creo que es la biblioteca ofensiva en la que se basa libnmf:

     nm $another_path/lib/libelemental.a | grep _ZN4elem6lapack3SVDEiiPdiS1_ 0000000000005290 T _ZN4elem6lapack3SVDEiiPdiS1_ 

    Todavía no estoy muy familiarizado con las bibliotecas y los enlazadores, por lo que cualquier ayuda sería apreciada. Gracias

    Edición: un poco de excavación me hizo darme cuenta de algo. ¿Hay alguna diferencia entre Mac OS X y Linux que debería tener en cuenta? Las personas para las que trabajo que escribieron esto originalmente informaron que no había errores de construcción como este

    Debería usar nm -C , para desenmarañar sus símbolos. También parece que estás mezclando bibliotecas estáticas y compartidas, lo que generalmente no es una buena idea. Además, el enlazador de gcc es un enlazador de una sola pasada, lo que significa que el orden de las banderas de la biblioteca es importante. Quiere listar las bibliotecas en orden de dependencia inverso. En otras palabras, si a depende de b, entonces b debe aparecer antes de a en las banderas del vinculador.

    Bueno, no puedo tratar de recrear su configuración y luego trabajar y probar una solución en mi configuración ya que no tengo su fuente, pero me parece que cuando compiló libnmf con fpic, fue recomstackdo con enlaces dynamics, mientras que antes solía estar enlazado estáticamente.

    Si mi suposición es correcta, entonces puedes intentar:

    1. comstackndo libnmf de nuevo con -fPIC , AND -static .
    2. cambiando su setup.py – agregue "elemental" a la lista de libraries – esto hará que el enlazador también obtenga esa lib.

    Debe tener en cuenta que el enfoque # 1 generalmente se considera menos deseable, pero como dije, podría ser que originalmente se compiló de esa manera. # 2, sin embargo, podría requerir más trabajo porque si hay otras libretas necesarias, también tendrá que buscarlas y agregarlas.