2009-08-20 8 views
4

Meine Mac OS-Anwendung ist mit einem nicht systemeigenen Framework Foo.framework verknüpft. Ich habe einen Verweis auf das Framework in XCode hinzugefügt und die App baut gut auf. Ich habe auch eine Regel, die das Framework in den Ausgabe-Frameworks-Ordner kopiert (MyApp.app/Contents/Frameworks). Zur Laufzeit sucht die Binärdatei jedoch nach dem Framework in ~/Library/Frameworks und die App kann nicht geladen werden.OSX: Ändern des Pfades von .framework

otool -l MyApp.app sagt mir auch, dass es nach dem Framework in/Users // Library/Frameworks sucht.

Kann jemand erklären, warum dies passiert, und was ist der richtige Weg, um die App im Frameworks-Ordner des Anwendungspakets aussehen zu lassen?

Meine hacky Problemumgehung ist, ein benutzerdefiniertes Skript aufzunehmen, um den Pfad in der Mach-O-Binärdatei mit install_name_tool zu ändern, aber ich bin mir sicher, dass es eine saubere Methode dafür gibt.

Antwort

6

Sie sind auf dem richtigen Weg.

Es passiert, weil unter OS X eine "install_name" in der Bibliothek aufgezeichnet wird, wenn es erstellt wird. Dieser install_name wird dann in jede Anwendung kopiert, die damit verknüpft ist.

Die "beste" Möglichkeit, das Problem zu lösen, besteht darin, die Quelle des Frameworks zu ändern, so dass das Flag für den Link - install_name gesetzt wird, wenn das Framework erstellt wird.

Dies ist jedoch oft nicht möglich, entweder weil Sie nicht die Quelle haben, oder das Framework hat eine riesige Menge von Autoconf-Zeug, das es fast unmöglich macht. Verwenden Sie in diesem Fall install_name_tool mit dem Flag -id, um die aufgezeichnete install_name in der Bibliothek zu ändern.

Also, mit allem, was gesagt, was ändern Sie es?

@executable_path /../ Frameworks/Foo.framework/Foo (oder was auch immer der Name ist)

Also, aus dem Verzeichnis Foo.framework enthält:

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

Zur Laufzeit der Lader wird @executable_path in den Pfad zur ausführbaren Datei der Anwendung auflösen. Natürlich müssen Sie auch eine Build-Phase Copy Files einrichten, um das Framework in den Framework-Ordner des Application-Bundles zu kopieren.

Sie können auch install_name_tool mit dem Flag -change verwenden, um den install_name einer Bibliothek zu ändern, nachdem sie bereits in der Anwendung verknüpft wurde, aber das ist offensichtlich suboptimal. Beheben Sie es vor dem Verknüpfen.

+0

Ok ja - genau das habe ich gemacht. Es fühlt sich gebrochen an. Ich würde mir vorstellen, dass Apple etwas zu XCode hinzufügen könnte, was es Entwicklern ermöglicht, den Laufzeitpfad festzulegen, wenn sie ein neues Framework angeben, mit dem verlinkt werden soll. – psychotik

Verwandte Themen