Ich installiere ein Programm auf einem Server als Nicht-Root-Benutzer. Insbesondere ist es tmux 1.5, aber dies sollte meiner Meinung nach allgemein für alle lokal installierten Programme gelten (ich erwähne den Programmnamen, falls dieses Problem nicht mein eigener Fehler ist).
Für das Programm muss ich einige abhängige Bibliotheken installieren (z. B. libevent und ncurses). Also habe ich 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 auch die Bibliothekspakete einschließen:
cd $HOME/program/installation/folder
./configure --prefix=$DIR CFLAGS="-I$DIR/include" LDFLAGS="-L$DIR/lib"
#... make ... make install
Ok, dies installiert das Programm ohne Probleme in $ HOME / local / bin, aber wenn ich die ausführbare Datei ausführe: $ HOME / local / bin / tmux, erhalte ich den folgenden Fehler:
tmux: Fehler beim Laden von gemeinsam genutzten Bibliotheken: libevent-2.0.so.5: freigegebene Objektdatei kann nicht geöffnet werden: Keine solche Datei oder kein solches Verzeichnis
Es scheint mir, 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, um sie auszuführen. Ich habe versucht, symbolische Links in $ HOME / lib, $ HOME / bin und $ HOME / local / bin einzufügen, aber keines davon hat funktioniert. Alle Ideen und Vorschläge wäre sehr dankbar
quelle
-R $DIR/lib
an, esCFLAGS
ist beim Bauentmux
(und nichtlibevent
). Dies hat mir nicht geholfen - es gab einen letzten Fehler von gcc, der besagte, dass es nicht erkannt werden kann-R
(außerdem habe ich es ohne das Leerzeichen zwischen-R
und versucht$DIR
). ./configure --disable-shared Dies hat funktioniert, die Aktualisierung hatLD_LIBRARY_PATH
auch funktioniert. Am Ende habe ichlibevent
wieder mit der obigen--disable-shared
Option gemacht.Antworten:
Versuchen Sie, libevent mit neu aufzubauen
Ich vermute, dass dies Ihr Problem beheben wird, da die Bibliothek beim Erstellen der Binärdatei verknüpft wird und zur Laufzeit nicht gesucht werden muss.
Wenn Sie ein dynamisch verknüpftes Libevent benötigen, können Sie alternativ das enthaltende Verzeichnis von Libevent-2.0.so.5 zu Ihrer Umgebungsvariablen LD_LIBRARY_PATH hinzufügen:
quelle
Sie können auch den RPATH festlegen, der den Bibliothekssuch-Patch in der Binärdatei selbst codiert .
Fügen Sie einfach
-R $DIR/lib
zuCFLAGS
.quelle
Kein Glück mit den anderen, aber das hat bei mir von hier aus funktioniert :
quelle
Ich habe eine ähnliche Frage gestellt , interessanterweise auch über das Bauen
tmux
aller Dinge (obwohl ich immer noch sicher bin, dass dies fast jede Situation betrifft, in der GNUconfigure
undmake
zusammen verwendet werden.Ich glaube, ein sauberer Ansatz besteht darin, den sogenannten "Pfad" zu verwenden - den in die Binärdatei eingebetteten Bibliothekssuchpfad. Der
-rpath
Schalter von mindestens GNU Linkerld
gibt den Pfad an.Die Build-Befehlszeile würde dann wie folgt aussehen:
Hier ist es nicht wirklich wichtig, aber
PKG_CONFIG_PATH
oben ist einfach die empfohlene Methode, um das zu tun, was die Leute sonst erreichen, wenn sie manuell-L/path/to/libevent/lib -I/path/to/libevent/include
an ein./configure
Skript senden . Beim Erstellenlibevent
werden eigene Konfigurationsdateien fürpkg-config
(die von verwendet werden./configure
) installiert . Sie sollten es nutzen, denn nurlibevent
definitiv weiß , was die Schalter verwendet werden sollte , wenn es gegen den Bau.In einigen Situationen
-rpath
ist dies jedoch ein sauberer 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 gegen eine bestimmte Bibliothek bauen möchten, die Sie irgendwo an einem bestimmten Ort in Ihrem Home-Ordner abgelegt haben, sollten-rpath
Lösungen auf der Basis von Kanonen als kanonische Antwort angesehen werden.Das Seltsame ist, warum
tmux
eigene Build-Skripte diesen Pfad während des Builds nicht aus dem Bibliothekssuchpfad ableiten. Vielleicht brauchen und sollen sie nicht, ich weiß es nicht. Ist es ein Zufall, dass uns das passiert isttmux
?quelle