MacOSX: Comment collecter des dépendances dans un paquet local?
-
21-09-2019 - |
Question
Je crée une application plugin (dylib) qui dépend de plusieurs autres bibliothèques. Ces autres bibliothèques sont installées sur mon système, mais ne sont pas garanties à installer sur le système d'un utilisateur. Je dois donc trouver un moyen de regrouper les dépendances avec mon application.
Je trouve que je peux utiliser otool
à la liste ou modifier les chemins d'autres dylibs. Cela permettrait de créer un dossier qui regroupe mon application plug-in et toutes les dépendances nécessaires.
Cependant, cela semble manuellement comme un temps et une tâche stupide. les services publics sont là disponibles pour automatiser?
Ou peut-être que je fais mal et il y a une meilleure et une approche plus évidente à ce problème?
Modifier J'ai créé le script d'un qui permet d'automatiser la tâche.
La solution
Utilisez des chemins relatifs dans votre dylib en utilisant install_name_tool. De cette façon, vous pouvez les régler une fois, et installer ce répertoire n'importe où sans avoir besoin de modifier vos bibliothèques lors de l'installation.
Vous devez placer toutes vos dépendances dylib dans un dossier, puis utilisez install_name_tool pour définir l'emplacement relatif des autres dylibs dont vous dépendez. Supposons que votre bibliothèque libmyfoo.dylib dépend libbar.dylib:
install_name_tool -change "/Whatever/full/path/libbar.dylib" "@loader_path/libbar.dylib" libmyfoo.dylib
De cette façon, votre bibliothèque cherchera toujours libbar.dylib dans le même répertoire où se trouve libmyfoo.dylib.
Vous devrez peut-être aussi d'exécuter install_name_tool sur quelques-uns des autres dylibs, si elles dépendent les uns des autres.
Attention, la documentation install_name_tool souligne que « pour que cet outil fonctionne lorsque les noms d'installation ou rpaths sont plus le binaire doit être construit avec la ld (1) -headerpad_max_install_names option. », alors assurez-vous d'inclure l'option de ligne de commande -headerpad_max_install_names
lors de la construction votre bibliothèque.
@loader_path
est par rapport au binaire utilisé pour charger le dylib, dans ce cas, votre libmyfoo.dylib. Utilisez @executable_path
si vous voulez trouver les bibliothèques par rapport à l'exécutable qui a commencé la séquence de chargement bibliothèque.
Autres conseils
Pour compléter la réponse de Christopher, voici quelques liens vers des ressources utiles:
Macdylibbundler est un petit outil pratique qui fait exactement ce qui est demandé. Il a certainement sauvé la vie lors de la distribution des binaires pour OSX.