Dove posso impostare DYLD_LIBRARY_PATH su Mac OS X ed è una buona idea?


28

Sto cercando di installare un risolutore scritto in C ++ sul mio Mac (OS X), per l'uso con il codice che ho scritto in XCode.

La documentazione del risolutore dice questo:

Assicurati di avere "." nel tuo DYLD_LIBRARY_PATHper

  • eseguire gli eseguibili già pronti
  • collegamento con libamg.dylib (e gfortran RTSlibs)

Non capisco davvero cosa significhi. Dove e cosa devo cambiare cosa?

Ho fatto qualche googling, ma non ho trovato nulla di abbastanza semplice per un principiante come me! Se ci sono persone pazienti là fuori a cui non dispiacerebbe indirizzarmi a una risorsa online o darmi le istruzioni su come e dove impostare le variabili di ambiente, sarei molto grato.

Risposte:


20

È una variabile d'ambiente e come tale è solitamente impostata in Terminal da

export DYLD_LIBRARY_PATH=someValue

man dyld dice:

DYLD_LIBRARY_PATH

Questo è un elenco separato da due punti di directory che contengono librerie. Il linker dinamico cerca queste directory prima di cercare le librerie nelle posizioni predefinite. Ti permette di testare nuove versioni di librerie esistenti.

Per ogni libreria utilizzata da un programma, il linker dinamico lo cerca DYLD_LIBRARY_PATHa turno in ciascuna directory . Se non riesce ancora a trovare la libreria, quindi cerca DYLD_FALLBACK_FRAMEWORK_PATHe DYLD_FALLBACK_LIBRARY_PATHa sua volta.

Utilizzare l' -Lopzione per otool(1). per scoprire i framework e le librerie condivise a cui è collegato l'eseguibile.


Probabilmente vorresti qualcosa del genere

export DYLD_LIBRARY_PATH=.:$DYLD_LIBRARY_PATH

anteporre .(directory corrente) all'elenco delle posizioni cercate. Sul mio OS X non modificato, DYLD_LIBRARY_PATHnon ha alcun valore corrente però:

$ echo $DYLD_LIBRARY_PATH

$

A seconda di come intendi eseguire il tuo programma, dovresti impostarlo diversamente, ad esempio in Xcode (non so dove).


1
Sono d'accordo con @TVNshack che di solito non dovresti impostare DYLD_LIBRARY_PATHDYLD_FRAMEWORK_PATH, perché potrebbe impedire a quelle librerie caricate di trovare librerie fornite dal sistema. Per farlo funzionare meglio, usa invece le FALLBACKversioni. Maggiori informazioni in questa risposta: stackoverflow.com/a/3172515/43615
SuperTempel

21

Non si dovrebbe mai impostare export DYLD_LIBRARY_PATHsul proprio sistema.

I percorsi di libreria condivisa possono essere riparati usando otool -Le install_name_tool.

Ad esempio, se compili Perl DBD-MySQL non sarai in grado di usarlo poiché il linker non sa dove hai installato 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

Questo è semplice.


FYI rapido: install_name_tool fallisce silenziosamente se il nuovo percorso è più lungo del percorso che sta sostituendo. Verificare sempre con 'otool -L' che il percorso sia stato modificato come previsto.
user15685

Diciamo che compilo un plug-in (praticamente una libreria dinamica da solo) che dipende da un'altra libreria dinamica. Come devo fornire il plug-in e le sue dipendenze per altri utenti?
Royi,

Se invece imposta DYLD_FALLBACK_FRAMEWORK_PATH, si fa opera in questo caso. È molto più facile che cambiare i percorsi interni delle librerie, soprattutto se devi fornire i dylibs creati con la tua app e non puoi prevedere il percorso in cui finiscono.
SuperTempel

7

In Xcode 4 puoi aggiungerlo allo schema del progetto per evitare errori come questo:

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. Nel menu fai clic su "Prodotto" -> "Modifica schema" -> scheda "Argomenti" -> Aggiungi "Variabili d'ambiente" -> Chiave: DYLD_LIBRARY_PATH Valore: / Users / Account utente personale / percorso / su / lib

  2. Modifica il percorso del tuo account utente e il percorso completo della cartella della libreria.

  3. Dovresti essere in grado di creare ed eseguire.

Impostazione di DYLD_LIBRARY_PATH in Xcode 4

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.