Ich installiere ein Programm auf einem Server als Nicht-Root-Benutzer. Genauer gesagt ist es tmux 1.5, aber meiner Meinung nach sollte dies allgemein für alle lokal installierten Programme gelten (ich erwähne den Programmnamen, falls dieses Problem am Ende nicht mein eigener Fehler ist).
Das Programm erfordert die Installation einiger abhängiger Bibliotheken (z. B. libevent und ncurses). Ich habe sie beide lokal installiert, da ich keinen Root-Zugriff habe.
cd $HOME/library/installation/folder
DIR=$HOME/local
./configure --prefix=$DIR
#... make ... make install
Um das Programm zu installieren, musste ich nun auch die Bibliothekspakete einbinden:
cd $HOME/program/installation/folder
./configure --prefix=$DIR CFLAGS="-I$DIR/include" LDFLAGS="-L$DIR/lib"
#... make ... make install
Ok, dadurch wird das Programm problemlos in $HOME/local/bin installiert. Wenn ich jedoch die ausführbare Datei $HOME/local/bin/tmux ausführe, erhalte ich die folgende Fehlermeldung:
tmux: Fehler beim Laden gemeinsam genutzter Bibliotheken: libevent-2.0.so.5: Gemeinsam genutzte Objektdatei kann nicht geöffnet werden: Keine solche Datei oder kein solches Verzeichnis
Mir scheint, dass das Programm die gewünschten Bibliotheken nicht finden kann, aber die Datei libevent-2.0.so.5 existiert tatsächlich in $HOME/local/lib, wie in den Konfigurationsoptionen angegeben. Ich frage mich, wie ich das Programm dazu bringen kann, die installierte Bibliothek zu erkennen, damit es ausgeführt werden kann. Ich habe versucht, symbolische Links in $HOME/lib, $HOME/bin und $HOME/local/bin einzufügen, aber nichts davon hat funktioniert. Alle Ideen und Vorschläge sind sehr willkommen.
Antwort1
Versuchen Sie, libevent neu zu erstellen mit
./configure --disable-shared
Ich vermute, dass dies Ihr Problem beheben wird, da die Bibliothek beim Erstellen der Binärdatei verknüpft wird und zur Laufzeit nicht danach gesucht werden muss.
Wenn Sie alternativ ein dynamisch verknüpftes Libevent benötigen, können Sie das enthaltene Verzeichnis von libevent-2.0.so.5 zu Ihrer Umgebungsvariable LD_LIBRARY_PATH hinzufügen:
export LD_LIBRARY_PATH=${HOME}/local/lib/:${LD_LIBRARY_PATH}
Antwort2
Sie können auch den RPATH festlegen, derkodiert den Bibliothekssuchpatch im Binärprogramm selbst.
Einfach -R $DIR/lib
hinzufügen CFLAGS
.
Antwort3
ich habe gefragteine ähnliche Frage, interessanterweise auch ausgerechnet über das Bauen tmux
, obwohl ich mir immer noch sicher bin, dass dies nicht auf so ziemlich jede Situation zutreffen sollte, in der GNU configure
und make
zusammen verwendet werden.
Ich glaube, ein saubererer Ansatz ist die Verwendung des sogenannten „rpath“ – des in der Binärdatei eingebetteten Bibliothekssuchpfads. Der -rpath
Schalter von zumindest GNU-Linker ld
ermöglicht es, den „rpath“ anzugeben.
Die Build-Befehlszeile würde dann wie folgt aussehen:
PKG_CONFIG_PATH=/path/to/libevent/lib/pkg-config LDFLAGS=-Wl,-rpath,/path/to/libevent/lib ./configure ...
Nicht wirklich wichtig hier, aber PKG_CONFIG_PATH
oben ist einfach die empfohlene Vorgehensweise, um das zu tun, was die Leute sonst erreichen, indem sie es manuell -L/path/to/libevent/lib -I/path/to/libevent/include
an ein ./configure
Skript senden. Wenn Sie erstellen libevent
, installiert es seine eigenen Konfigurationsdateien für pkg-config
(die von verwendet werden ./configure
). Sie sollten es verwenden, weil nurlibevent
definitivweiß, welche Schalter beim Bauen dagegen verwendet werden sollten.
Wie dem auch sei, in manchen Situationen -rpath
ist dies ein saubererer Ansatz zur Lösung des Problems.
LD_LIBRARY_PATH
-basierte Lösungen ermöglichen es Ihnen jedoch, die von Ihrer erstellten Binärdatei zur Laufzeit verwendete Bibliothek zu jonglieren, was manchmal wünschenswert ist. Wenn Sie jedoch nur mit einer bestimmten Bibliothek erstellen möchten, die Sie an einem dedizierten Ort in Ihrem Home-Ordner abgelegt haben, sind -rpath
-basierte Lösungen meiner Meinung nach als kanonische Antwort zu betrachten.
Das Seltsame ist, warum tmux
eigene Build-Skripte diesen Pfad beim Erstellen nicht aus dem Bibliothekssuchpfad ableiten. Vielleicht müssen und sollten sie das nicht, ich weiß es nicht. Ist es ein Zufall, dass uns, die wir bauen, das passiert ist tmux
?
Antwort4
Kein Glück mit den anderen, aber das hat bei mir funktioniert, vonHier:
sudo ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5