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!

32
demandé sur Alfred Zhong 2011-01-13 08:21:32

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)
    ...
36
répondu Akos Cz 2016-07-09 06:45:26

Vous devez définir l' DYLD_LIBRARY_PATH variable d'environnement.

dyld page de manuel de:

      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.
14
répondu EmeryBerger 2011-01-13 05:29:45

de nombreuses façons. peut-être que cela aidera à:

http://www.mikeash.com/pyblog/friday-qa-2009-11-06-linking-and-install-names.html

6
répondu justin 2011-01-13 05:30:30

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.

2
répondu Stephen Canon 2011-01-13 05:34:37