La liaison à une bibliothèque dynamique sur un Mac avec chemin d'accès complet
Je suis liant (extension Python) la bibliothèque qui intègre le Matlab moteur avec la commande suivante (générés en utilisant cmake)
c++ -mmacosx-version-min=10.6 -bundle -headerpad_max_install_names -o library.so library.o /Applications/MATLAB_R2009b.app/bin/maci64/libeng.dylib /Applications/MATLAB_R2009b.app/bin/maci64/libmx.dylib -framework Python
résultant dans
$ otool -L library.so
library.so:
@loader_path/libeng.dylib (compatibility version 0.0.0, current version 0.0.0)
@loader_path/libmx.dylib (compatibility version 0.0.0, current version 0.0.0)
/System/Library/Frameworks/Python.framework/Versions/2.6/Python (compatibility version 2.6.0, current version 2.6.1)
/opt/local/lib/gcc44/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.13.0)
/opt/local/lib/gcc44/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.0.0)
Cependant, lorsque j'essaie d'utiliser la bibliothèque, je reçois un message d'erreur:
ImportError: dlopen(./library.so, 2): Library not loaded: @loader_path/libmex.dylib
Referenced from: ./library.so
Reason: image not found
Je crois que le problème vient du fait que l'éditeur de liens comprend l'matlab dylib fichiers dans le formulaire @loader_path/libeng.dylib
plutôt que d'utiliser le chemin d'accès complet, même si je donne le chemin d'accès complet à g++
. Comment puis-je forcer l'éditeur de liens d'utiliser le chemin complet?
Je sais que la seule solution est d'utiliser
export DYLD_LIBRARY_PATH=/Applications/MATLAB_R2009b.app/bin/maci64:$DYLD_LIBRARY_PATH
qui est l'endroit où ceux de la bibliothèque se trouvent les fichiers, mais je voudrais éviter qu'il en provoque d'autres problèmes.
- Veuillez vous référer à ma réponse dans ce lien [Add_libray][1] [1]: stackoverflow.com/questions/4876740/...
Vous devez vous connecter pour publier un commentaire.
De modifier manuellement les fichiers à l'aide de
install_name_tool
Je pouvais l'utiliser comme une solution temporaire, mais je me demande si il n'y a pas une meilleure solution, lorsque l'éditeur de liens est donnée d'un paramètre à utiliser les chemins d'accès complets.
@loader_path
. La dyld page de manuel a été utile pour expliquer le comportement de dyld qu'en ce qui concerne les chemins d'accès absolus et de l'expansion de@loader_path
.Remarque que certains des problèmes avec
DYLD_LIBRARY_PATH
peuvent être évités par l'utilisation deDYLD_FALLBACK_LIBRARY_PATH
à la place. Ce ne sera utilisée que si la lib ne peut pas être trouvé dans les chemins d'accès par défaut.Regarder dans l'-rpath option pour le ld de commande pour le contrôle de cette. Vous pourriez également être intéressé par le contenu de https://github.com/bimargulies/jni-origin-testbed, qui est une démonstration de quelques techniques pertinentes.
La critique de la technique est ici:
Vous pouvez également utiliser le lien symbolique !