Où dois-je définir DYLD_LIBRARY_PATH sur Mac OS X, et est-ce une bonne idée?

28

J'essaie d'installer un solveur écrit en C ++ sur mon Mac (OS X), pour l'utiliser avec du code que j'ai écrit en XCode.

La documentation du solveur dit ceci:

Assurez-vous d'avoir "." dans votre DYLD_LIBRARY_PATHafin de

  • exécuter les exécutables prêts à l'emploi
  • lien avec le libamg.dylib (et le gfortran RTSlibs)

Je ne comprends pas vraiment ce que cela signifie. Où et de quoi ai-je besoin pour changer quoi?

J'ai fait quelques recherches sur Google, mais je n'ai rien trouvé de suffisamment simple pour un débutant comme moi! S'il y a des patients qui ne voudraient pas me diriger vers une ressource en ligne ou me donner les ab-cs de comment et où définir les variables d'environnement, je serais très reconnaissant.

Fourmi
la source

Réponses:

20

Il s'agit d'une variable d'environnement et en tant que telle est généralement définie dans Terminal par

export DYLD_LIBRARY_PATH=someValue

man dyld dit:

DYLD_LIBRARY_PATH

Il s'agit d'une liste de répertoires séparés par deux points qui contiennent des bibliothèques. L'éditeur de liens dynamique recherche ces répertoires avant de rechercher les emplacements par défaut des bibliothèques. Il vous permet de tester de nouvelles versions de bibliothèques existantes.

Pour chaque bibliothèque utilisée par un programme, l'éditeur de liens dynamique le recherche DYLD_LIBRARY_PATHsuccessivement dans chaque répertoire . S'il ne parvient toujours pas à trouver la bibliothèque, il effectue une recherche DYLD_FALLBACK_FRAMEWORK_PATHet DYLD_FALLBACK_LIBRARY_PATHà son tour.

Utilisez l' -Loption pour otool(1). pour découvrir les frameworks et les bibliothèques partagées auxquels l'exécutable est lié.


Vous voudriez probablement quelque chose comme

export DYLD_LIBRARY_PATH=.:$DYLD_LIBRARY_PATH

pour ajouter .(répertoire actuel) à la liste des emplacements recherchés. Sur mon OS X non modifié, DYLD_LIBRARY_PATHn'a pas de valeur actuelle cependant:

$ echo $DYLD_LIBRARY_PATH

$

Selon la façon dont vous avez l'intention d'exécuter votre programme, vous devrez définir cela différemment, par exemple dans Xcode (je ne sais pas où cependant).

Daniel Beck
la source
1
Je suis d'accord avec @TVNshack que vous ne devriez généralement pas définir DYLD_LIBRARY_PATHni DYLD_FRAMEWORK_PATH, car cela peut empêcher ces bibliothèques chargées de trouver des bibliothèques fournies par le système. Pour que cela fonctionne mieux, utilisez plutôt les FALLBACKversions. Plus d'informations dans cette réponse: stackoverflow.com/a/3172515/43615
SuperTempel
21

Il ne faut jamais configurer export DYLD_LIBRARY_PATHvotre système.

Les chemins de bibliothèque partagée peuvent être corrigés à l'aide de otool -Let install_name_tool.

Par exemple, si vous compilez Perl DBD-MySQL, vous ne pourrez pas l'utiliser car l'éditeur de liens ne sait pas où vous avez installé MySQL.

># make
....


># otool -L blib/arch/auto/DBD/mysql/mysql.bundle

blib/arch/auto/DBD/mysql/mysql.bundle:
        libmysqlclient.18.dylib (compatibility version 18.0.0, current version 18.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.11)


#> install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib blib/arch/auto/DBD/mysql/mysql.bundle


># otool -L blib/arch/auto/DBD/mysql/mysql.bundle

blib/arch/auto/DBD/mysql/mysql.bundle:
        /usr/local/mysql/lib/libmysqlclient.18.dylib (compatibility version 18.0.0, current version 18.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.11)



#> make test
...
Result: PASS

#> make install

C'est aussi simple que ça.

TVNshack
la source
Rapide info: install_name_tool avec échec en silence si le nouveau chemin est plus long que le chemin qu'il remplace. Vérifiez toujours avec 'otool -L' que le chemin a été modifié comme prévu.
user15685
Disons que je compile un plug-in (essentiellement une bibliothèque dynamique en soi) qui dépend d'une autre bibliothèque dynamique. Comment dois-je fournir le plug-in et ses dépendances aux autres utilisateurs?
Royi
Si vous définissez à la place DYLD_FALLBACK_FRAMEWORK_PATH, il fait le travail dans ce cas. C'est beaucoup plus facile que de changer les chemins internes des bibliothèques, surtout si vous devez fournir les dylibs construits avec votre application et que vous ne pouvez pas prédire le chemin vers lequel ils aboutissent.
SuperTempel
7

Dans Xcode 4, vous pouvez l'ajouter au schéma de projet pour éviter des erreurs comme celle-ci:

dyld: Library not loaded: @loader_path/libLeap.dylib
  Referenced from: /Users/paulsolt/Library/Developer/Xcode/DerivedData/LeapTest-eqcxmzewheyjusgrcszyvlcxlgna/Build/Products/Debug/LeapTest
  Reason: image not found
  1. Dans le menu, cliquez sur "Produit" -> "Modifier le schéma" -> onglet "Arguments" -> Ajouter "Variables d'environnement" -> Clé: DYLD_LIBRARY_PATH Valeur: / Users / MyUserAccount / path / to / lib

  2. Modifiez le chemin d'accès à votre compte d'utilisateur et le chemin d'accès complet au dossier de la bibliothèque.

  3. Vous devriez pouvoir construire et exécuter.

Définition de DYLD_LIBRARY_PATH dans Xcode 4

Paul Solt
la source