Comment utiliser dylib dans Mac OS X (C++)
j'ai fait une application (un exécutable) appelant avec succès certains dylib, cependant, les fichiers dylib et l'exécutable sont dans un répertoire différent. J'ai ajouté le répertoire contient des fichiers dylib à la variable d'environnement $PATH, cependant, il ne se charge toujours pas. Je copie tous les fichiers dylib dans l'exécutable, le programme s'exécute enfin. Cela confirme que les fichiers dylib n'ont aucun problème. Cependant, Comment puis-je dire à L'OS de le trouver? Dans windows, j'ai juste besoin d'ajouter le chemin de répertoire contient des fichiers dll à $CHEMIN. Que dois-je faire pour Mac OS X? Merci beaucoup!
4 réponses
après avoir lu le lien que Justin a fourni, j'ai réussi à utiliser le @executable_path
jeton de changer mon dylib install_name pour pointer vers le même répertoire où mon exécutable se trouve.
@executable_path les chemins absolus sont ennuyeux. Parfois, vous souhaitez intégrer un cadre dans une application au lieu d'avoir à installer le cadre dans / Bibliothèque ou un endroit similaire.
la solution du Mac est @executable_path. C'est une magie jeton qui, lorsqu'il est placé au début d'une bibliothèque d'installation du nom, se étendue au chemin de l'exécutable qui le charge, moins le dernier composant. Par exemple, disons que d'un Bar.app de liens Foo.Framework. Si La Barre.l'application est installée dans / Applications, @executable_path passera à /Applications / Bar.app / Contents / MacOS. Si vous avez l'intention d'intégrer le cadre dans des contenus / cadres, alors vous je peux juste mettre Foo.cadre de l'installation nom de @executable_path/../ Frameworks / Foo.framework / Versions / a / Foo. Le l'éditeur de liens dynamiques étendra que pour / Applications / Bar.app / Contents / MacOS/../ Frameworks / Foo.cadre / Versions/A / Foo et va trouver le cadre.
http://www.mikeash.com/pyblog/friday-qa-2009-11-06-linking-and-install-names.html
je vais le démontrer par un exemple.
disons que j'ai l'exécutable suivant / opt / local/bin / convert et ses dylibes sont en / opt / local / lib. Je veux le copier vers un autre dir et lui faire charger ses dylibs à partir du même répertoire que celui où j'ai copié l'exécutable.
> mkdir ~/tmp/bin
> cp /opt/local/bin/convert ~/tmp/bin
obtenir une liste des exécutables dylibs
> otool -L ~/tmp/bin/convert
~/tmp/bin/convert:
/opt/local/lib/libtiff.3.dylib (compatibility version 13.0.0, current version 13.5.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
/opt/local/lib/libjpeg.8.dylib (compatibility version 12.0.0, current version 12.0.0)
/opt/local/lib/libfontconfig.1.dylib (compatibility version 6.0.0, current version 6.4.0)
/opt/local/lib/libiconv.2.dylib (compatibility version 8.0.0, current version 8.1.0)
/opt/local/lib/libfreetype.6.dylib (compatibility version 15.0.0, current version 15.0.0)
/opt/local/lib/libexpat.1.dylib (compatibility version 7.0.0, current version 7.2.0)
/opt/local/lib/libbz2.1.0.dylib (compatibility version 1.0.0, current version 1.0.6)
/opt/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.6)
...
je ne se soucient de la dylibs dans le / opt / local / lib dir, afin de nous sortir que dylibs / opt. Je veux que toutes les autres références à dylib restent intactes. / usr/lib / libSystem trucs.
> DYLIBS=`otool -L ~/tmp/bin/convert | grep "/opt" | awk -F' ' '{ print }'`
Copiez tous les DYLIB que l'exécutable renvoie au même dir où l'exécutable a été copié.
> for dylib in $DYLIBS; do cp $dylib ~/tmp/bin/; done;
install_name_tool
pour changer le nom d'installation de tous les dylibs que nous avons retirés dans l'étape ci-dessus, et les remplacer par le@executable_path
au nom dylib. Cela permettra au linker dynamique de chercher le dylib dans le même répertoire que celui où l'exécutable est hébergé.
> for dylib in $DYLIBS; do install_name_tool -change $dylib @executable_path/`basename $dylib` ~/tmp/bin/convert; done;
Confirmer que l'installation noms ont été changés et que libSystem indique toujours / usr/lib / libSystem.
> otool -L ~/tmp/bin/convert
~/tmp/bin/convert:
@executable_path/libtiff.3.dylib (compatibility version 13.0.0, current version 13.5.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
@executable_path/libjpeg.8.dylib (compatibility version 12.0.0, current version 12.0.0)
@executable_path/libfontconfig.1.dylib (compatibility version 6.0.0, current version 6.4.0)
@executable_path/libiconv.2.dylib (compatibility version 8.0.0, current version 8.1.0)
@executable_path/libfreetype.6.dylib (compatibility version 15.0.0, current version 15.0.0)
@executable_path/libexpat.1.dylib (compatibility version 7.0.0, current version 7.2.0)
@executable_path/libbz2.1.0.dylib (compatibility version 1.0.0, current version 1.0.6)
@executable_path/libz.1.dylib (compatibility version 1.0.0, current version 1.2.6)
...
Vous devez définir l' DYLD_LIBRARY_PATH
variable d'environnement.
This is a colon separated list of directories that contain libraries. The dynamic linker
searches these directories before it searches the default locations for libraries. It allows
you to test new versions of existing libraries.
For each library that a program uses, the dynamic linker looks for it in each directory in
DYLD_LIBRARY_PATH in turn. If it still can't find the library, it then searches DYLD_FALL-
BACK_FRAMEWORK_PATH and DYLD_FALLBACK_LIBRARY_PATH in turn.
de nombreuses façons. peut-être que cela aidera à:
http://www.mikeash.com/pyblog/friday-qa-2009-11-06-linking-and-install-names.html
si le dylib est à l'endroit spécifié par INSTALL_NAME de la bibliothèque, il ne fonctionnera que*.
sinon, vous pouvez ajouter l'emplacement du dylib à DYLD_LIBRARY_PATH. Vous voudrez peut-être lire le dyld documentation.
*) pour être tout à fait précis, il doit être à DYLD_ROOT_PATH/INSTALL_NAME, mais s'agiter avec DYLD_ROOT_PATH est assez rare.