Installieren einer Bibliothek lokal im Home-Verzeichnis, aber das Programm erkennt sie nicht

10

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

Scicalculator
quelle
Ich nehme -R $DIR/liban, es CFLAGSist beim Bauen tmux(und nicht libevent). 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 -Rund versucht $DIR). ./configure --disable-shared Dies hat funktioniert, die Aktualisierung hat LD_LIBRARY_PATHauch funktioniert. Am Ende habe ich libeventwieder mit der obigen --disable-sharedOption gemacht.

Antworten:

20

Versuchen Sie, libevent mit neu aufzubauen

./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 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:

export LD_LIBRARY_PATH=${HOME}/local/lib/:${LD_LIBRARY_PATH}
Drootang
quelle
Wow, vielen Dank für die schnelle Antwort. Am Ende habe ich LD_LIBRARY_PATH verwendet, um das Problem zu beheben, da ich dieses Update einfach auf zukünftige Bibliotheksinstallationen anwenden und immer das Verzeichnis $ HOME / local verwenden konnte. Schätzen Sie die Hilfe!
Scicalculator
2

Kein Glück mit den anderen, aber das hat bei mir von hier aus funktioniert :

sudo ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5
Bart
quelle
2

Ich habe eine ähnliche Frage gestellt , interessanterweise auch über das Bauen tmuxaller Dinge (obwohl ich immer noch sicher bin, dass dies fast jede Situation betrifft, in der GNU configureund makezusammen verwendet werden.

Ich glaube, ein sauberer Ansatz besteht darin, den sogenannten "Pfad" zu verwenden - den in die Binärdatei eingebetteten Bibliothekssuchpfad. Der -rpathSchalter von mindestens GNU Linker ldgibt den Pfad an.

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 ...

Hier ist es nicht wirklich wichtig, aber PKG_CONFIG_PATHoben 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/includean ein ./configureSkript senden . Beim Erstellen libeventwerden eigene Konfigurationsdateien für pkg-config(die von verwendet werden ./configure) installiert . Sie sollten es nutzen, denn nur libevent definitiv weiß , was die Schalter verwendet werden sollte , wenn es gegen den Bau.

In einigen Situationen -rpathist 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 -rpathLösungen auf der Basis von Kanonen als kanonische Antwort angesehen werden.

Das Seltsame ist, warum tmuxeigene 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 ist tmux?

amn
quelle