2009-03-02 16 views
9

Qual è il posto migliore per impostare la variabile LD_LIBRARY_PATH specifica dell'applicazione su Solaris? Come funzionaDove impostare LD_LIBRARY_PATH su Solaris?

LD_LIBRARY_PATH

lavoro variabile?

Al momento configurarlo in .kshrc, ma diverse applicazioni bisogno di diverse versioni di framework di messaggistica, ma queste applicazioni vengono eseguite con lo stesso uso e quindi avrebbero bisogno di diversi LD_LIBRARY_PATH, quindi secondo te qual è il posto migliore per impostare questa variabile?

Fondamentalmente sto cercando di capire come rendere questa parte di percorso variabile dell'applicazione anziché specifica dell'ambiente dell'utente.

risposta

14

In genere avrei solo uno script di shell che avvia l'applicazione. Nello script della shell imposterò LD_LIBRARY_PATH in qualsiasi cosa mi occorresse per quell'app, quindi avvii lo script avviando quell'app. In questo modo, il percorso dovrebbe essere impostato solo per quell'applicazione.

+0

Grazie, è quello che stavo pensando. Tuttavia avrebbe senso inserire tale variabile nel file app_profile esterno e quindi importare quel file nello script? O vedi qualche problema con quello? Sto pensando poiché più app hanno bisogno dello stesso percorso che potrebbe avere senso esternalizzarlo? –

+0

LD_LIBRARY_PATH (o LD_LIBRARY_PATH_32 e LD_LIBRARY_PATH_64) devono essere impostati prima dell'avvio dell'eseguibile, perché ld.so.1 lo legge prima di arrivare a main() e non lo rilegge in seguito. –

+0

@Ville - Penso che funzionerebbe, ma vorrai provarlo prima per essere sicuro –

6

È possibile trovare una descrizione formale di LD_LIBRARY_PATH nella pagina man di "ld.so.1", ovvero eseguire "man ld.so.1". Descrive anche alcune altre variabili che sono onorato dal linker di runtime.

Oltre a LD_LIBRARY_PATH, gli eseguibili e le librerie condivise possono anche avere un percorso di ricerca incorporato per le librerie. Se stai eseguendo un'applicazione collegata da te, puoi utilizzare l'opzione -d di ld per impostare il percorso integrato (sia Sun CC che gcc hanno opzioni per fare la stessa cosa). Questo potrebbe consentire di evitare l'uso di LD_LIBRARY_PATH in primo luogo.

-1

È possibile utilizzare il comando crle:

crle -l/path/to/file/lib/file di

+1

crle soffre dello stesso problema dell'impostazione in un file di ambiente globale - interessa tutte le applicazioni, quindi non aiuta quando applicazioni diverse richiedono versioni diverse delle librerie. – alanc

+0

alanc ha ragione. –

+1

@alanc è * errato *. 'crle -c' ti permetterà di influenzare applicazioni specifiche (vedi Esempio 6 su http://docs.oracle.com/cd/E19082-01/819-2239/crle-1/index.html) – vladr

1

La risposta crle è più corretta. Su Solaris, non utilizzare LD_LIBRARY_PATH. Usa invece crle. Per visualizzare i percorsi correnti, basta eseguire "crle" da solo. Per aggiornare l'elenco, utilizzare crle -u -l /path/to/your/lib/directory. Il -u è necessario per scrivere modifiche alla configurazione del sistema, altrimenti la modifica sarà temporanea. Vedi la pagina man per ulteriori opzioni.

+2

Come notato nei commenti alla precedente risposta di Crle, non è la soluzione migliore, dal momento che influenza * tutti i programmi *, non solo quelli che hanno bisogno di un percorso diverso da quello con cui sono stati costruiti. Un wrapper di shell shell per impostare LD_LIBRARY_PATH solo per quelle applicazioni è molto più sicuro e salutare rispetto al rischio di modifiche a tutti i programmi ed è l'unico modo per gestire le diverse applicazioni che richiedono percorsi incompatibili. – alanc

+2

@alanc, errato; puoi usare 'crle -c' per definire gli ambienti per applicazione, a manifest di Windows (vedi Esempio 6 su http://docs.oracle.com/cd/E19082-01/819-2239/crle-1/index. html). – vladr

0

Appena trovato un caso che LD_LIBRARY_PATH globale non ha effetto, ho dovuto avvolgere uno script e impostare LD_LIBRARY_PATH prima dell'applicazione. crle è una buona soluzione globale se hai installato un sacco di librerie sotto/opt/csw/lib, tramite pkgutil da blastwave.

0

È possibile controllare il file .profile o .profile.user. Ci sarà una voce commentata per esso. Non è consigliabile utilizzarlo poiché è danneggiato. È necessario creare i file binari passando i valori alle flag anziché utilizzare la variabile.

2

Vladr, alanc è corretto.

Non è consigliabile impostare LD_LIBRARY_PATH su Solaris. Affatto.

Se è necessario cuocere un runpath specifico nella libreria o eseguibile, , è necessario utilizzare il flag -R sul linker. Se si costruisce con gcc, quindi usare -Wl, Rpath (penso).

Se è necessario eseguire questa operazione per un passaggio post-costruzione (ad esempio, poiché manca la fonte da ricompilare), quindi elfedit (1) sarà di grande aiuto. È documentato nella manpage, e anche nella Linker + Libraries Guide a http://docs.oracle.com/cd/E26502_01/html/E26507/index.html

+0

Per motivi di compatibilità, GCC su Solaris comprende anche '-R'. Puoi ancora usare '-Wl, -Rsomedir' perché è trasferibile su Linux. Oppure usa '-Wl, -rpath, somedir' che è anche inteso per es. dal runtime linker su Solaris e Linux. – maxschlepzig

Problemi correlati