2009-11-23 18 views
13

Ho un'applicazione suddivisa in diverse librerie ai fini del riutilizzo del codice. Su Windows tutto ciò che devo fare è mettere i file .dll nello stesso percorso dell'eseguibile e li trova automaticamente. Su Linux (poiché codifica i percorsi verso le cose) devo specificare la variabile ambientale LD_LIBRARY_PATH o precaricare le librerie prima dell'eseguibile.Percorso libreria condivisa come directory eseguibile

Ho visto alcune cose sull'incorporare il percorso usando l'opzione linker di -Wl,-rpath=<PATH> e l'ho provato usando il percorso .. Ma guarda solo nella directory di lavoro corrente, non nella directory dell'eseguibile.

C'è un modo per specificare nel linker di cercare nella directory dell'eseguibile per le librerie condivise per impostazione predefinita (come su Windows)?

Grazie! Matt

risposta

18

Hai bisogno di $ ORIGIN nel tuo RPATH, tramite un'opzione appropriata per ld o altri strumenti Darwin. Vedi this e this.

Ricordare che il $ deve davvero finire nel percorso, quindi è necessario citare o scappare nella riga di comando del collegamento.

Aggiornamento: Si può vedere ciò che il linker effettivamente messo nel vostro eseguibile con

readelf -d /path/to/exe | grep RPATH 

Ecco ciò che l'output dovrebbe essere simile:

0x0000000f (RPATH)    Library rpath: [$ORIGIN] 
+4

Quando si utilizza $ ORIGIN, è necessario assicurarsi che $ sia correttamente quotato in modo che il linker lo veda effettivamente. Dalla riga di comando, si desidera "-rpath \ $ ORIGIN" e da un Makefile si desidera "-rpath \ $$ ORIGIN" –

+0

Sto usando Eclipse e CDT e sto inserendo l'opzione sotto i flag di linker vari. Sto mettendo '-Wl, -rpath = $$ ORIGIN' e nella finestra di output lo mostra con un singolo $. Ma non sembra funzionare. Ho provato diverse varianti, ma non succede nulla. È come se il linker ignorasse semplicemente la bandiera. Ho provato: -Wl, -rpath = $ ORIGIN -Wl, - rpath = $ ORIGIN -Wl, -rpath =/$ ORIGIN -Wl, -rpath = $ ORIGIN/ -Wl, -rpath =/$ ORIGIN/ ecc. – CuppM

+0

Usa elfdump o l'equivalente locale per vedere cosa c'è dentro? Usa ldd e vedi cosa dice? – bmargulies

2

avvolgere il vostro programma in uno script di shell:

#!/bin/sh 

PROGRAM_DIRECTORY="`dirname "$0"`" 
export LD_LIBRARY_PATH="$PROGRAM_DIRECTORY" 

"$PROGRAM_DIRECTORY/program_executable" "[email protected]" 

Se si esegue questo script (al posto del tuo eseguibile) y il nostro programma si collegherà perfettamente.

+0

Sì, è quello che ho fatto e funziona. L'applicazione ha una versione parallela che utilizza OpenMPI e che ha un modo di condividere LD_LIBRARY_PATH. Quindi stiamo usando questa soluzione alternativa, ma ci piacerebbe un modo più semplice di fare le cose perché l'applicazione (così come il corridore MPI) accetta più flag per cosa elaborare – CuppM

+0

Puoi passare tutti gli argomenti dal tuo script al programma con ' "$ @"'. –

Problemi correlati