Gdzie ustawić DYLD_LIBRARY_PATH na Mac OS X i czy to dobry pomysł?

28

Próbuję zainstalować solver napisany w C ++ na moim Macu (OS X), do użytku z kodem, który napisałem w XCode.

Dokumentacja solvera mówi:

Pamiętaj, aby mieć „.” w twoim DYLD_LIBRARY_PATHcelu

  • uruchom gotowe pliki wykonywalne
  • link do libamg.dylib (i gfortran RTSlibs)

Naprawdę nie rozumiem, co to znaczy. Gdzie i co muszę zmienić?

Zrobiłem trochę googlingu, ale nie spotkałem niczego, co byłoby wystarczająco proste dla nowicjusza takiego jak ja! Jeśli byliby tam ludzie cierpliwi, którzy nie mieliby nic przeciwko skierowaniu mnie do zasobu online lub przekazaniu abc-abs w jaki sposób i gdzie ustawić zmienne środowiskowe, byłbym bardzo wdzięczny.

Mrówka
źródło

Odpowiedzi:

20

Jest to zmienna środowiskowa i jako taka jest zwykle ustawiana w Terminalu przez

export DYLD_LIBRARY_PATH=someValue

man dyld mówi:

DYLD_LIBRARY_PATH

To jest lista katalogów zawierających biblioteki oddzielonych dwukropkami. Dynamiczny linker przeszukuje te katalogi, zanim przeszuka domyślne lokalizacje bibliotek. Umożliwia testowanie nowych wersji istniejących bibliotek.

Dla każdej biblioteki używanej przez program dynamiczny linker szuka jej kolejno w każdym katalogu DYLD_LIBRARY_PATH. Jeśli nadal nie może znaleźć biblioteki, przeszukuje DYLD_FALLBACK_FRAMEWORK_PATHi DYLD_FALLBACK_LIBRARY_PATHkolejno.

Użyj -Lopcji, aby otool(1). aby odkryć frameworki i biblioteki współdzielone, z którymi powiązany jest plik wykonywalny.


Prawdopodobnie chcesz coś takiego

export DYLD_LIBRARY_PATH=.:$DYLD_LIBRARY_PATH

dodawać .(bieżący katalog) do listy przeszukiwanych lokalizacji. W moim niezmodyfikowanym OS X DYLD_LIBRARY_PATHnie ma jednak bieżącej wartości:

$ echo $DYLD_LIBRARY_PATH

$

W zależności od tego, jak zamierzasz uruchomić program, musisz ustawić to inaczej, np. W Xcode (choć nie wiem gdzie).

Daniel Beck
źródło
1
Zgadzam się z @TVNshack, że zwykle nie powinieneś ustawiać DYLD_LIBRARY_PATHani DYLD_FRAMEWORK_PATH, ponieważ może to uniemożliwić załadowanym bibliotekom znalezienie bibliotek dostarczonych przez system. Aby to działało lepiej, użyj FALLBACKwersji. Więcej informacji w tej odpowiedzi: stackoverflow.com/a/3172515/43615
SuperTempel
21

Nigdy nie należy ustawiać export DYLD_LIBRARY_PATHw systemie.

Ścieżki do biblioteki współdzielonej można naprawić za pomocą otool -Li install_name_tool.

Na przykład, jeśli skompilujesz Perla DBD-MySQL, nie będziesz mógł go użyć, ponieważ linker nie wie, gdzie zainstalowałeś MySQL.

># make
....


># otool -L blib/arch/auto/DBD/mysql/mysql.bundle

blib/arch/auto/DBD/mysql/mysql.bundle:
        libmysqlclient.18.dylib (compatibility version 18.0.0, current version 18.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.11)


#> install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib blib/arch/auto/DBD/mysql/mysql.bundle


># otool -L blib/arch/auto/DBD/mysql/mysql.bundle

blib/arch/auto/DBD/mysql/mysql.bundle:
        /usr/local/mysql/lib/libmysqlclient.18.dylib (compatibility version 18.0.0, current version 18.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.11)



#> make test
...
Result: PASS

#> make install

To takie proste.

TVNshack
źródło
Szybka informacja: narzędzie nazwa_instalacji z opcją cichą, jeśli nowa ścieżka jest dłuższa niż ścieżka, którą zastępuje. Zawsze sprawdzaj za pomocą „otool -L”, czy ścieżka została zmieniona zgodnie z oczekiwaniami.
user15685,
Załóżmy, że kompiluję wtyczkę (w zasadzie samą bibliotekę dynamiczną), która zależy od innej biblioteki dynamicznej. Jak powinienem dostarczyć wtyczkę i jej zależności innym użytkownikom?
Royi
Jeśli zamiast ustawić DYLD_FALLBACK_FRAMEWORK_PATH, to robi prac w tej sprawie. Jest to o wiele łatwiejsze niż zmiana wewnętrznych ścieżek bibliotek, zwłaszcza jeśli musisz dostarczyć wbudowane dylibs za pomocą aplikacji i nie możesz przewidzieć ścieżki, na której się znajdą.
SuperTempel
7

W Xcode 4 możesz dodać go do schematu projektu, aby uniknąć błędów takich jak ten:

dyld: Library not loaded: @loader_path/libLeap.dylib
  Referenced from: /Users/paulsolt/Library/Developer/Xcode/DerivedData/LeapTest-eqcxmzewheyjusgrcszyvlcxlgna/Build/Products/Debug/LeapTest
  Reason: image not found
  1. W menu kliknij „Produkt” -> „Edycja schematu” -> karta „Argumenty” -> Dodaj „Zmienne środowiskowe” -> Klucz: DYLD_LIBRARY_PATH Wartość: / Users / MyUserAccount / path / to / lib

  2. Zmień ścieżkę do swojego konta użytkownika i pełną ścieżkę do folderu biblioteki.

  3. Powinieneś być w stanie zbudować i uruchomić.

Ustawienie DYLD_LIBRARY_PATH w Xcode 4

Paul Solt
źródło