2 votos

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

Estoy ejecutando un script 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

Configurar export DYLIB_LIBRARY_PATH=/opt/local/lib/ no ayuda en este caso (tampoco debería ser necesario que cada usuario del sistema establezca esa variable de entorno). Ya he ejecutado update_dyld_shared_cache .

El módulo de Python en cuestión reside en /opt/local/lib/python2.7/site-packages así que hice un enlace simbólico a él 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.

2voto

Ibrahim Puntos 1

Las bibliotecas se referencian normalmente utilizando rutas absolutas en OS X, por lo que no es necesario establecer ninguna variable. Su otool -L en el módulo de Python debería contener

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

Esta ruta se copia de lo que Apple llama el "nombre de identificación de la biblioteca compartida" en una biblioteca cuando se enlaza contra ella. Esto significa que cualquier valor que aparezca 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 haces esto en tu máquina, notarás que tampoco contiene una ruta absoluta. Esa es la causa principal del problema que ves.

En primer lugar, se trata de un error en GNU Radio, o en el paquete de MacPorts de GNU Radio. Por favor, envíe un ticket para que esto pueda ser corregido o tratado con los desarrolladores de GNU Radio.

En segundo lugar, hay un par de maneras de evitar este problema por ahora:

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

  • Método B: Fijar la ruta en el comando de carga del módulo de Python. Utilice 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.

0 votos

Ha funcionado. Gracias. El fallo no es de MacPorts' -- compilé ese módulo específico (grgsm) para GNU Radio. libgnuradio-grgsm.dylib y site-packages/grgsm son ambos construidos como parte de la construcción de grgsm. Probablemente debería reconfigurar los archivos cmake para grgsm, pero por ahora he utilizado tanto el método A como el B que has propuesto en lugar de reconstruir grgsm.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X