2009-11-23 5 views
13

Ich habe eine Anwendung, die zum Zwecke der Wiederverwendung von Code in mehrere Bibliotheken aufgeteilt ist. Unter Windows muss ich nur die .dll-Dateien im selben Pfad wie die ausführbare Datei ablegen und sie werden automatisch gefunden. Unter Linux (da es die Pfade zu Dingen fest codiert) muss ich die Umgebungsvariable LD_LIBRARY_PATH angeben oder die Bibliotheken vor der ausführbaren Datei laden.Gemeinsam genutzter Bibliothekspfad als ausführbares Verzeichnis

Ich habe einige Dinge über das Einbetten des Pfades mit der Linker-Option -Wl,-rpath=<PATH> gesehen und ich habe es mit . als Pfad versucht. Aber das sieht nur im aktuellen Arbeitsverzeichnis aus, nicht im Verzeichnis der ausführbaren Datei.

Gibt es eine Möglichkeit, im Linker anzugeben, standardmäßig im Verzeichnis der ausführbaren Datei für die gemeinsam genutzten Bibliotheken zu suchen (wie unter Windows)?

Danke! Matt

Antwort

18

Sie benötigen $ ORIGIN in Ihrem RPATH, über eine geeignete Option für LD oder andere Darwin-Tool. Siehe this und this.

Denken Sie daran, dass das $ wirklich im Pfad enden muss, also müssen Sie es in der Link-Befehlszeile angeben oder es auskommentieren.

Update: Sie können sehen, was die Linke tatsächlich in der ausführbaren Datei setzte mit

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

Hier ist, was die Ausgabe sollte wie folgt aussehen:

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

Wenn Sie $ ORIGIN verwenden, müssen Sie sicherstellen, dass das $ korrekt zitiert wird, so dass der Linker es tatsächlich sieht. Von der Kommandozeile wollen Sie "-rpath \ $ ORIGIN" und von einem Makefile, das Sie wollen "-rpath \ $$ ORIGIN" –

+0

Ich benutze Eclipse und CDT, und ich setze die Option unter den verschiedenen Linker Flags. Ich lege '-Wl, -rpath = $$ ORIGIN 'und im Ausgabefenster zeigt es es mit einem einzigen $. Aber es scheint nicht zu funktionieren. Ich habe verschiedene Varianten ausprobiert, aber nichts passiert. Es ist wie der Linker ignoriert die Flagge. Ich habe versucht: -Wl, -rpath = $ ORIGIN -Wl, - rpath = $ ORIGIN -Wl, -rpath =/$ ORIGIN -Wl, -rpath = $ ORIGIN/ -Wl, -rpath =/$ ORIGIN/ etc. – CuppM

+0

Verwenden Sie Elfdump oder die lokale Entsprechung, um zu sehen, was drin ist? Verwenden Sie LDD und sehen Sie, was es sagt? – bmargulies

2

Ihr Programm in einem Shell-Skript Wrap:

#!/bin/sh 

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

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

Wenn Sie dieses Skript (anstelle Ihrer ausführbaren Datei) y ausführen Unser Programm wird gut funktionieren.

+0

Ja, genau das habe ich gemacht und es funktioniert. Die Anwendung verfügt über eine parallelisierte Version, die OpenMPI verwendet und die LD_LIBRARY_PATH freigeben kann. Wir verwenden diese Problemumgehung jetzt, aber wir möchten eine einfachere Vorgehensweise, da die Anwendung (wie auch der MPI-Runner) mehrere Flags für die Verarbeitung benötigt. – CuppM

+0

Sie können alle Argumente aus Ihrem Skript an das Programm übergeben '" $ @ "'. –

Verwandte Themen