¿Cómo le digo a Python de MacPorts que busque dylibs en / opt / local / lib?

1

Estoy ejecutando un script de Python con la versión MacPorts de Python (2.7), es decir, he ejecutado:

port select --set python python27

Sin embargo, cuando ejecuto mi script, no puede encontrar un dylib en /opt/local/lib :

ImportError: dlopen(/opt/local/lib/python2.7/site-packages/grgsm/_grgsm_swig.so, 2): Library not loaded: libgnuradio-grgsm.dylib
Referenced from: /opt/local/lib/python2.7/site-packages/grgsm/_grgsm_swig.so
Reason: image not found

El dylib en cuestión reside aquí:

-rwxr-xr-x  1 root  admin    816036 Dec 16 11:24 /opt/local/lib/libgnuradio-grgsm.dylib

La configuración de export DYLIB_LIBRARY_PATH=/opt/local/lib/ no ayuda en este caso (tampoco debería ser realmente necesario para cada usuario del sistema configurar esa variable de entorno). Ya he ejecutado update_dyld_shared_cache .

El módulo Python en cuestión reside en /opt/local/lib/python2.7/site-packages , así que hice un enlace simbólico en /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/ .

otool -L en la carga .so informes:

otool -L /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/grgsm/_grgsm_swig.so

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/grgsm/_grgsm_swig.so:
libgnuradio-grgsm.dylib (compatibility version 0.0.0, current version 0.0.0)
/opt/local/lib/libboost_filesystem-mt.dylib (compatibility version 0.0.0, current version 0.0.0)
/opt/local/lib/libboost_system-mt.dylib (compatibility version 0.0.0, current version 0.0.0)
/opt/local/lib/libboost_thread-mt.dylib (compatibility version 0.0.0, current version 0.0.0)
/opt/local/lib/libgnuradio-runtime.3.7.8.1.dylib (compatibility version 3.7.8, current version 0.0.0)
/opt/local/lib/libgnuradio-pmt.3.7.8.1.dylib (compatibility version 3.7.8, current version 0.0.0)
/opt/local/lib/libvolk.1.1.1.dylib (compatibility version 1.1.1, current version 0.0.0)
/usr/local/lib/libosmocore.7.dylib (compatibility version 8.0.0, current version 8.0.0)
/usr/local/lib/libosmogsm.5.dylib (compatibility version 7.0.0, current version 7.0.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.1.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1225.1.1)

Observe que la biblioteca en cuestión no tiene una ruta.

    
pregunta watkipet 16.12.2015 - 23:03

1 respuesta

1

Normalmente se hace referencia a las bibliotecas utilizando rutas absolutas en OS X, por lo que no es necesario establecer ninguna variable. Por lo tanto, su salida otool -L en el módulo Python debería contener

/opt/local/lib/libgnuradio-grgsm.$version.dylib (...)

Esta ruta se copia de lo que Apple denomina "nombre de identificación de biblioteca compartida" en una biblioteca cuando se vincula con ella. Eso significa que cualquier valor que se encuentre en la salida de otool -L en el módulo de Python es el mismo valor que se obtiene al ejecutar otool -D en /opt/local/lib/libgnuradio-grgsm.dylib (o simplemente usando otool -L y mirando la primera línea). Si hace esto en su máquina, notará que tampoco contiene una ruta absoluta. Esa es la causa raíz del problema que ves.

Primero, este es un error en GNU Radio, o el paquete de MacPorts de GNU Radio. Presente un ticket para que esto pueda ser arreglado o solucionado por los desarrolladores de GNU Radio.

En segundo lugar, hay un par de formas de solucionar este problema por ahora:

  • Método A: arregla el nombre de identificación de libgnuradio-grgsm.dylib . Esto se puede hacer usando install_name_tool -id $correctID /opt/local/lib/libgnuradio-grgsm.dylib . Tenga en cuenta que la ruta absoluta al dylib no versionado probablemente no sea el valor correcto para esto. libgnuradio-grgsm.dylib es probablemente un enlace simbólico a otro enlace simbólico con la versión principal incorporada. Esta ruta es la que debe usarse como nombre de instalación. Después de este cambio, la reconstrucción del módulo Python debería resolver el problema.

  • Método B: corrija la ruta en el comando de carga del módulo Python. Use install_name_tool -change libgnuradio-grgsm.dylib $correctID /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/grgsm/_grgsm_swig.so para hacer esto. $correctID debe elegirse como se explica en el Método A.

respondido por el neverpanic 17.12.2015 - 19:09

Lea otras preguntas en las etiquetas