Xcode ciągle szuka dylib na złej ścieżce

To mój błąd:

dyld: Library not loaded: /usr/local/lib/libofa.0.dylib
Referenced from: /sers/david/Projekte/Test/build/Debug/Test.app/Contents/MacOS/Test
Reason: image not found

Poszperałem trochę i zmieniłem ścieżkę wewnątrz dyliba za pomocą install_name_tool:

davids-macbook:Test david$ otool -L libofa.0.0.0.dylib 
libofa.0.0.0.dylib:
@executable_path/../Frameworks/libofa.0.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1)
/System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)

Ale Xcode wciąż szuka go w /usr / lib/:

build/Debug/Test.app/Contents/MacOS/Test:
/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 15.0.0)
/System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox (compatibility version 1.0.0, current version 1.0.0)
/opt/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
@executable_path/../Frameworks/TagLib.framework/Versions/A/TagLib (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/QTKit.framework/Versions/A/QTKit (compatibility version 1.0.0, current version 1.0.0)
/opt/local/lib/libexpat.1.dylib (compatibility version 7.0.0, current version 7.2.0)
/System/Library/Frameworks/Quartz.framework/Versions/A/Quartz (compatibility version 1.0.0, current version 1.0.0)
/opt/local/lib/libcurl.4.dylib (compatibility version 7.0.0, current version 7.0.0)
/usr/local/lib/libofa.0.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 103.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 227.0.0)
/System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices (compatibility version 1.0.0, current version 44.0.0)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 550.29.0)
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 751.29.0)
/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 1038.32.0)

Jest jakiś sposób, aby ustawić to w Xcode??? Dzięki

Edit: biblioteka nie jest projektem Xcode. Jego budowa z ./ configure; make

Author: david, 2011-02-02

3 answers

Normalnie to co robię to:

  1. Ustaw katalog instalacyjny biblioteki na @rpath. Spowoduje to ustawienie nazwy instalacji na @rpath/libofa.0.0.0.dylib. Jeśli budujesz bibliotekę samodzielnie, możesz ustawić ją w Xcode; w przeciwnym razie użyj install_name_tool, aby ją zmienić.
  2. Ustaw ścieżki wyszukiwania Runpath aplikacji używającej biblioteki do lokalizacji katalogu zawierającego bibliotekę. Na przykład, jeśli umieścisz bibliotekę w katalogu frameworków aplikacji, Ustaw ścieżki wyszukiwania Runpath na @executable_path/../Frameworks (lub @loader_path/../Frameworks).

Ten wpis na blogu i Ten wnikają bardziej szczegółowo.

 23
Author: mipadi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-07 01:24:22

Upewnij się, że instalujesz narzędzia wiersza poleceń z developer.apple.com a następnie dodaj bibliotekę do swojego projektu. Uruchom następujący skrypt w Xcode: Cele "fazy budowania" Uruchom skrypt i po prostu wykonaj:

install_name_tool -id @executable_path/../Frameworks/librayName.dylib "$SRCROOT/librayName.dylib"

Uwaga: NIE " lub "" wymagane przed nazwą dylib

 8
Author: itechnician,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-20 10:20:04

Zanim przejdziesz do rozwiązania, powinieneś wiedzieć, co nowego z zależną biblioteką "dylib" w MAC, w porównaniu do zależnej biblioteki " dll " w windows.

Główną różnicą w dylib vs dll jest "nazwa instalacji". Nazwa instalacji jest ścieżką do dynamicznej biblioteki, która mówi, gdzie znaleźć bibliotekę w czasie wykonywania. Nie ma znaczenia gdzie skopiujesz dylibys, zawsze bedzie wskazywal na Stara path(chyba ze bez zmiany nazwy instalacji). Możesz poznać oryginalną ścieżkę wyszukiwania (nazwę instalacji) za pomocą polecenie jak poniżej

otool -L a.dylib

(wystarczy przeciągnąć dylib zamiast a.dylib)

Aby uzyskać więcej informacji na temat nazwy instalacji, zapoznaj się z tym linkiem .

Teraz rozwiązaniem do zmiany nowej lokalizacji dla dylib ("nazwa instalacji") jest użycie {[1] } Jak poniżej

install_name_tool -change *old path of dylb* *new path of dylib*

Możesz uzyskać starą ścieżkę za pomocą otool -L komendy opisanej powyżej.(old path tzn. original path)

install_name_tool -change może również zmienić ścieżkę wyszukiwania dylib i wykonywalnego.

Możesz użyć tego w Xcode zapisując plik Run script w Twoim projekcie.

 4
Author: NIlesh Srivastava,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-10 06:25:38