2 votes

Comment puis-je dire à MacPorts Python de chercher dylibs dans /opt/local/lib ?

J'exécute un script Python avec la version MacPorts de Python (2.7), c'est-à-dire que j'ai exécuté :

port select --set python python27

Cependant, lorsque j'exécute mon script, il ne peut pas trouver une dylib dans /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

La dylib en question se trouve ici :

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

Réglage de export DYLIB_LIBRARY_PATH=/opt/local/lib/ n'est d'aucune utilité dans ce cas (et il ne devrait pas être nécessaire que chaque utilisateur du système définisse cette variable d'environnement). J'ai déjà exécuté update_dyld_shared_cache .

Le module Python en question se trouve dans /opt/local/lib/python2.7/site-packages J'ai donc créé un lien symbolique dans le répertoire /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/ .

otool -L sur le chargement .so rapports :

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)

Remarquez que la bibliothèque en question n'a pas de chemin d'accès.

2voto

Ibrahim Points 1

Les bibliothèques sont généralement référencées à l'aide de chemins absolus sous OS X, ce qui rend inutile la définition de variables. Votre otool -L La sortie sur le module Python devrait donc contenir

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

Ce chemin est copié à partir de ce qu'Apple appelle le "nom d'identification de la bibliothèque partagée" dans une bibliothèque lorsque vous liez cette dernière. Cela signifie que toute valeur figurant dans la sortie de otool -L sur le module Python est la même valeur que celle que vous obtenez en exécutant otool -D sur /opt/local/lib/libgnuradio-grgsm.dylib (ou simplement en utilisant otool -L et en regardant la première ligne). Si vous faites cela sur votre machine, vous remarquerez qu'il ne contient pas non plus de chemin absolu. C'est la cause première du problème que vous rencontrez.

Premièrement, il s'agit d'un bogue dans GNU Radio, ou dans l'emballage de GNU Radio par MacPorts. Veuillez remplir un ticket afin que ce problème puisse être corrigé ou traité par les développeurs de GNU Radio.

Deuxièmement, il existe plusieurs façons de contourner ce problème pour le moment :

  • Méthode A : Fixer le nom d'identification de libgnuradio-grgsm.dylib . Cela peut être fait en utilisant install_name_tool -id $correctID /opt/local/lib/libgnuradio-grgsm.dylib . Notez que le chemin absolu vers la dylib non versionnée n'est probablement pas la valeur correcte pour ceci. libgnuradio-grgsm.dylib est probablement un lien symbolique vers un autre lien symbolique avec la version majeure incorporée. Ce chemin est celui qui doit être utilisé comme nom d'installation. Après cette modification, la reconstruction du module Python devrait résoudre le problème.

  • Méthode B : Fixez le chemin dans la commande load du module Python. Utilisez 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 pour le faire. $correctID doit être choisi comme expliqué dans la méthode A.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X