2009-08-20 5 views
4

Mon application Mac OS est liée à un framework Foo.framework non fourni par le système. J'ai ajouté une référence au framework dans XCode et l'application se construit très bien. J'ai également une règle qui copie le cadre dans le dossier Frameworks de sortie (MyApp.app/Contents/Frameworks). Cependant, lors de l'exécution, le binaire recherche le framework dans ~/Library/Frameworks et l'application ne se charge pas. MyApp.app me dit aussi qu'il cherche le framework dans/Users // Library/Frameworks. Est-ce que quelqu'un peut expliquer pourquoi cela se produit, et quelle est la bonne façon de faire apparaître l'application dans le dossier Frameworks de l'ensemble d'applications? Ma solution de contournement hacky est d'inclure un script personnalisé pour modifier le chemin dans le binaire mach-o en utilisant install_name_tool, mais je suis sûr qu'il existe une façon propre de le faire.OSX: modification du chemin de .framework

Répondre

6

Vous êtes sur la bonne voie.

Cela se produit car sur OS X, un "install_name" est enregistré dans la bibliothèque lors de sa création. Ce nom d'installation est ensuite copié dans toute application liée à celui-ci.

La "meilleure" façon de résoudre le problème consiste à modifier la source de l'infrastructure de sorte que l'indicateur de liaison - install_name soit défini lors de la construction de l'infrastructure.

Cependant, ce n'est souvent pas possible, soit parce que vous n'avez pas la source, soit parce que le framework a un énorme désordre d'autoconf qui le rend presque impossible. Dans ce cas, utilisez install_name_tool avec l'indicateur -id pour modifier le install_name enregistré dans la bibliothèque. Donc, avec tout cela dit, à quoi le changez-vous?

@executable_path /../ Cadres/Foo.framework/Foo (ou quel que soit le nom est)

Ainsi, à partir du répertoire contenant Foo.framework:

install_name_tool -id @executable_path/../Frameworks/Foo.framework/Foo Foo.framework/Foo 

Lors de l'exécution, le chargeur va résoudre @executable_path vers le chemin d'accès à l'exécutable de l'application. De toute évidence, vous devez également configurer une phase de génération Copier les fichiers pour copier l'infrastructure dans le dossier Framework de l'ensemble d'applications.

Vous pouvez également utiliser install_name_tool avec l'option -change pour changer le nom d'installation d'une bibliothèque après qu'elle a déjà été liée à l'application, mais c'est évidemment sous-optimal. Corrigez-le avant de créer un lien.

+0

Ok oui, c'est exactement ce que j'ai fait. Ça semble cassé. Je voudrais image Apple pourrait ajouter quelque chose à XCode qui permet aux développeurs de définir le chemin d'exécution lors de la spécification d'un nouveau cadre à lier. – psychotik

Questions connexes