2012-10-23 15 views
9

Ich habe eine App, rufen Sie Animal.app. In seinem Ordner Contents/Frameworks ist ein Framework, sagen Mammal.framework. Und innerhalb des Ordners Versions/A/Frameworks des Rahmens habe ich dog.dylib. Der Installationsname dog.dylib lautet @ rpath/dog.dylib. Für die "Runpath Search Paths" Einstellung des Frameworks habe ich @loader_path/../Frameworks angegeben. (Meine Argumentation für die letzte Einstellung ist, dass der „Lader“ des dylib die binären des Rahmens sein würde, auf dem Weg Mammal.framework/Versions/A/Mammal.)@rpath für eine dynamische Bibliothek in einem Framework eingebettet

Ich erhalte eine Fehlermeldung zur Laufzeit:

Dyld Error Message: 
    Library not loaded: @rpath/dog.dylib 
    Referenced from: /Volumes/VOLUME/*/Animal.app/Contents/MacOS/../Frameworks/Mammal.framework/Versions/A/Mammal 
    Reason: image not found 

I Ich habe Apples "Run-Path Dependent Libraries" -Dokumentation gelesen und Mike Ashs Blogbeitrag auf @rpath, aber ich kann immer noch nicht sehen, was ich falsch mache.

Antwort

6

Es stellt sich heraus, dass der richtige Pfad für den Suchpfad @loader_path/Frameworks ist. Was mir fehlte, ist, dass @loader_path nicht der vollständige Pfad zum Loader darstellt, sondern dieser Pfad abzüglich seiner letzten Komponente. Mike Ash's blog post sagt das, aber ich habe es irgendwie vermisst. Im Falle eines Frameworks endet @ loader_path mit dem A.

+0

Ja, um klar zu sein: Das Installationsverzeichnis für Ihre verschachtelte dylib und das übergeordnete Framework sollte "@rpath" lauten. Das übergeordnete Framework enthält dann "@ loader_path/Frameworks" in seinen Pfadpfaden-Suchpfaden (da die dylib als Geschwister des Frameworks-Ordners endet); Die App, die dieses Framework verwendet, enthält "@loader_path /../ Frameworks" (da die ausführbare Datei in MacOS heruntergefahren ist). Die App könnte '@ executable_path' genauso gut verwenden, aber' @ loader_path' scheint cooler zu sein :-) – natevw

+1

Ich verstehe nicht, was du getan hast, damit es funktioniert ... erkläre es mir, als wäre ich 6. –

+2

@ Prof.Falken: In den Build-Einstellungen für das Framework gibt es unter Linking eine Einstellung namens "Runpath Search Paths". Ich setze den Wert auf '@ loader_path/Frameworks'. – JWWalker