2012-10-23 11 views
9

Mam aplikację, nazwij ją Animal.app. Wewnątrz folderu Contents/Frameworks znajduje się framework, na przykład Mammal.framework. A wewnątrz folderu Versions/A/Frameworks mam dog.dylib. Nazwa instalacji dog.dylib to @ rpath/dog.dylib. W przypadku ustawienia architektury ramki "Runpath Search Paths" podałem @loader_path/../Frameworks. (Moje rozumowanie dla tego ostatniego ustawienia jest to, że „ładowarka” w dylib byłby binarny ram na ścieżce Mammal.framework/Versions/A/Mammal).@ ścieżka dla biblioteki dynamicznej osadzonej w strukturze

otrzymuję komunikat o błędzie podczas uruchamiania:

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 Przeczytałem dokumentację Apple "Run-Path Dependent Libraries" i blog Mike'a na temat wpisu na @rpath, ale nadal nie widzę, co robię źle.

Odpowiedz

6

Okazuje się, że właściwą ścieżką przeszukiwania ścieżek jest @loader_path/Frameworks. To, czego mi brakowało, to ścieżka @loader_path, a nie pełna ścieżka do programu ładującego, ale ta ścieżka minus ostatni składnik. Mike Ash's blog post mówi tak, ale jakoś mi to umknęło. Tak więc w przypadku szkieletu ścieżka @loader_ kończy się na A.

+0

Tak, dla jasności: katalog instalacyjny dla zagnieżdżonego dylib i jego struktury nadrzędnej powinien być "@rpath". Struktura nadrzędna obejmuje wtedy "@ ścieżka_ciągania/struktury" w swoich ścieżkach przeszukiwania ścieżek (ponieważ kończy się jako rodzeństwo folderu Frameworki); aplikacja korzystająca z tej struktury obejmuje "@loader_path /../ Frameworks" (od kiedy plik wykonywalny jest wyłączony w MacOS). Aplikacja mogłaby równie dobrze używać '@_pliku_przeprowadzania', ale' @ ścieżka_poczta' wydaje się fajniejsza :-) – natevw

+1

Nie rozumiem, co tak naprawdę zrobiłeś, aby to działało ... wyjaśnij mi to tak, jakbym był 6. –

+2

@ Prof.Falken: W ustawieniach kompilacji dla frameworku, w obszarze Łączenie istnieje ustawienie o nazwie "Ścieżki wyszukiwania Ścieżka do pracy". Ustawiam jego wartość na "@ loader_path/Frameworks". – JWWalker

Powiązane problemy