web-dev-qa-db-fra.com

Pourquoi install_name_tool et otool sont-ils nécessaires pour les bibliothèques Mach-O dans Mac Os X?

Je développe une application Cocoa en utilisant la dernière version de Xcode 4, je veux lier des bibliothèques dynamiques à mon projet (dylibs).

J'ai lu quelque part que l'ajout des bibliothèques dans mon projet n'était pas suffisant car je dois exécuter install_name_tool et otool pour que mon projet utilise les bibliothèques incluses dans mon projet.

J'ai lu les pages de manuel de install_name_tool, mais je ne comprends pas POURQUOI je dois le faire.

Comment fonctionnent les bibliothèques? Particulièrement intéressé par la partie où l'application et les bibliothèques ont des chemins qui pointent vers des endroits spécifiques de ma machine, comme /usr/local/lib/mylibrary.dylib lors de l'exécution otool -L

37
Alex

Apple a plusieurs façons de localiser les bibliothèques partagées:

  1. @executable_path: par rapport à l'exécutable principal
  2. @loader_path: par rapport au binaire référent
  3. @rpath: par rapport à n'importe quelle liste de chemins.

@rpath est l'ajout le plus récent, introduit dans OS X 10.5.

Si, par exemple, vous voulez avoir votre exécutable dans Contents/MacOS et bibliothèques dans Contents/Libraries vous pouvez effectuer les opérations suivantes:

install_name_tool -id @rpath/Libraries/lib_this.dylib   builddir/lib_this.dylib

et dans l'ensemble exécutable de niveau supérieur rpath avec:

install_name_tool -add_rpath @loader_path/..  myexecutable

et:

install_name_tool -change builddir/lib_this.dylib @rpath/Libraries/lib_this.dylib myexecutable

Remarque: le premier chemin après -change doit correspondre exactement à ce qui se trouve actuellement dans le binaire.

Si vous vous perdez otool -l -v myexecutable vous indiquera quelles commandes de chargement se trouvent exactement dans l'exécutable.

Voir man dyld et man install_name_tool pour plus d'informations.

63
Willem Hengeveld

Il existe également un outil GUI nommé MacDependency qui exposera toutes les bibliothèques dépendantes ( https://github.com/kwin/macdependency/ ).

10
Konrad Windszus