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
Apple a plusieurs façons de localiser les bibliothèques partagées:
@executable_path
: par rapport à l'exécutable principal@loader_path
: par rapport au binaire référent@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.
Il existe également un outil GUI nommé MacDependency qui exposera toutes les bibliothèques dépendantes ( https://github.com/kwin/macdependency/ ).