Wo lege ich DYLD_LIBRARY_PATH unter Mac OS X fest? Ist dies eine gute Idee?

28

Ich versuche, einen in C ++ geschriebenen Solver auf meinem Mac (OS X) zur Verwendung mit Code zu installieren, den ich in XCode geschrieben habe.

In der Solver-Dokumentation heißt es:

Stellen Sie sicher, dass Sie "." in deiner DYLD_LIBRARY_PATHum

  • Führen Sie die fertig erstellten ausführbaren Dateien aus
  • Verknüpfung mit der libamg.dylib (und den gfortran RTSlibs)

Ich verstehe nicht wirklich, was das bedeutet. Wo und was muss ich ändern, was?

Ich habe ein bisschen gegoogelt, bin aber auf nichts gestoßen, was für einen Neuling wie mich einfach genug ist! Wenn es geduldige Leute gibt, denen es nichts ausmacht, mich zu einer Online-Ressource zu leiten oder mir zu erklären, wie und wo Umgebungsvariablen gesetzt werden sollen, wäre ich sehr dankbar.

Ameise
quelle

Antworten:

20

Es ist eine Umgebungsvariable und wird daher normalerweise in Terminal von festgelegt

export DYLD_LIBRARY_PATH=someValue

man dyld sagt:

DYLD_LIBRARY_PATH

Dies ist eine durch Doppelpunkte getrennte Liste von Verzeichnissen, die Bibliotheken enthalten. Der dynamische Linker durchsucht diese Verzeichnisse, bevor er die Standardspeicherorte nach Bibliotheken durchsucht. Hier können Sie neue Versionen vorhandener Bibliotheken testen.

Für jede Bibliothek, die ein Programm verwendet, sucht der Dynamic Linker nacheinander in jedem Verzeichnis DYLD_LIBRARY_PATH. Wenn die Bibliothek immer noch nicht gefunden werden kann, wird nach DYLD_FALLBACK_FRAMEWORK_PATHund DYLD_FALLBACK_LIBRARY_PATHnach gesucht.

Verwenden Sie die -LOption zu otool(1). um die Frameworks und gemeinsam genutzten Bibliotheken zu ermitteln, mit denen die ausführbare Datei verknüpft ist.


Du würdest wahrscheinlich so etwas wollen

export DYLD_LIBRARY_PATH=.:$DYLD_LIBRARY_PATH

.(aktuelles Verzeichnis) der Liste der gesuchten Orte voranstellen . Hat auf meinem unveränderten OS X DYLD_LIBRARY_PATHkeinen aktuellen Wert:

$ echo $DYLD_LIBRARY_PATH

$

Abhängig davon, wie Sie Ihr Programm ausführen möchten, müssen Sie dies anders einstellen, z. B. in Xcode (ich weiß jedoch nicht, wo).

Daniel Beck
quelle
1
Ich stimme mit @TVNshack , dass Sie sollten in der Regel nicht gesetzt DYLD_LIBRARY_PATHnoch DYLD_FRAMEWORK_PATH, weil sie diese geladene Libs verhindern kann vom System bereitgestellte Bibliotheken zu finden. Verwenden Sie stattdessen die FALLBACKVersionen , damit dies besser funktioniert . Weitere Informationen in dieser Antwort: stackoverflow.com/a/3172515/43615
SuperTempel
21

Man sollte niemals export DYLD_LIBRARY_PATHauf dein System einstellen .

Freigegebene Bibliothekspfade können mit otool -Lund festgelegt werden install_name_tool.

Wenn Sie beispielsweise Perl DBD-MySQL kompilieren, können Sie es nicht verwenden, da der Linker nicht weiß, wo Sie MySQL installiert haben.

># 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

Das ist so einfach.

TVNshack
quelle
Schnelle Information: install_name_tool schlägt unbemerkt fehl, wenn der neue Pfad länger ist als der Pfad, den es ersetzt. Vergewissern Sie sich immer mit 'otool -L', dass der Pfad wie erwartet geändert wurde.
user15685
Angenommen, ich kompiliere ein Plug-In (im Grunde genommen eine dynamische Bibliothek), das von einer anderen dynamischen Bibliothek abhängt. Wie soll ich das Plug-In und seine Abhängigkeiten für andere Benutzer bereitstellen?
Royi
Wenn Sie stattdessen setzen DYLD_FALLBACK_FRAMEWORK_PATH, es tut Arbeit in diesem Fall. Dies ist viel einfacher als das Ändern der internen Pfade der Bibliotheken, insbesondere wenn Sie die erstellten Dylibs mit Ihrer App bereitstellen müssen und nicht vorhersagen können, auf welchem ​​Pfad sie landen.
SuperTempel
7

In Xcode 4 können Sie es zum Projektschema hinzufügen, um Fehler wie diesen zu vermeiden:

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. Klicken Sie im Menü auf "Produkt" -> "Schema bearbeiten" -> Registerkarte "Argumente" -> "Umgebungsvariablen" hinzufügen -> Schlüssel: DYLD_LIBRARY_PATH Wert: / Users / MyUserAccount / path / to / lib

  2. Ändern Sie den Pfad zu Ihrem Benutzerkonto und den vollständigen Pfad zum Bibliotheksordner.

  3. Sie sollten in der Lage sein, zu erstellen und auszuführen.

Festlegen von DYLD_LIBRARY_PATH in Xcode 4

Paul Solt
quelle