Eine Bibliothek wird lokal im Home-Verzeichnis installiert, aber das Programm erkennt sie nicht

Eine Bibliothek wird lokal im Home-Verzeichnis installiert, aber das Programm erkennt sie nicht

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/libhinzufü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 configureund makezusammen verwendet werden.

Ich glaube, ein saubererer Ansatz ist die Verwendung des sogenannten „rpath“ – des in der Binärdatei eingebetteten Bibliothekssuchpfads. Der -rpathSchalter von zumindest GNU-Linker ldermö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_PATHoben 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/includean ein ./configureSkript 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 -rpathist 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 tmuxeigene 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

verwandte Informationen