it-swarm.com.de

Wie geben Sie den Speicherort von Bibliotheken für eine Binärdatei an? (Linux)

Für diese Frage verwende ich ein spezielles Beispiel, aber dies verallgemeinert so ziemlich jede Binärdatei unter Linux, die ihre abhängigen Bibliotheken nicht zu finden scheint. Ich habe also ein Programm, das wegen fehlender Bibliotheken nicht ausgeführt werden kann:

./cart5: error while loading shared libraries: libcorona-1.0.2.so: cannot open shared object file: No such file or directory

ldd beleuchtet das Problem:

linux-vdso.so.1 =>  (0x00007fff18b01000)
libcorona-1.0.2.so => not found
libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.4.3/libstdc++.so.6 (0x00007f0975830000)
libm.so.6 => /lib/libm.so.6 (0x00007f09755af000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007f0975399000)
libc.so.6 => /lib/libc.so.6 (0x00007f0975040000)
libz.so.1 => /lib/libz.so.1 (0x00007f0974e2b000)
/lib64/ld-linux-x86-64.so.2 (0x00007f0975b36000)

Corona ist jedoch installiert:

[email protected]$ find / -name libcorona-1.0.2.so 2> /dev/null

/usr/local/lib64/libcorona-1.0.2.so
/home/oliver/installed/corona-1.0.2/src/.libs/libcorona-1.0.2.so

Wie kann ich der Binärdatei mitteilen, wo sie nach der "fehlenden" Bibliothek suchen soll?

30
Mala

Setzen Sie für eine einmalige Eingabe die Variable LD_LIBRARY_PATH auf eine durch Doppelpunkte getrennte Liste der zu durchsuchenden Verzeichnisse. Dies ist analog zu PATH für ausführbare Dateien, außer dass die Standardsystemverzeichnisse zusätzlich nach den durch die Umgebung angegebenen Verzeichnissen durchsucht werden.

LD_LIBRARY_PATH=/usr/local/lib64 ./cart5

Wenn Sie ein Programm haben, mit dem Bibliotheken an einem nicht standardmäßigen Speicherort aufbewahrt werden und nicht in der Lage sind, sie selbst zu finden, können Sie ein Wrapper-Skript schreiben:

#!/bin/sh
if [ -n "$LD_LIBRARY_PATH" ]; then
  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64
else
  LD_LIBRARY_PATH=/usr/local/lib64
fi
export LD_LIBRARY_PATH
exec /path/to/cart5 "[email protected]"

Die Liste der Standardsystemverzeichnisse wird in /etc/ld.so.conf gespeichert. Neuere Systeme ermöglichen es dieser Datei, andere Dateien einzuschließen. Wenn Ihre Datei include /etc/ld.so.conf.d/*.conf enthält, erstellen Sie eine neue Datei mit dem Namen /etc/ld.so.conf.d/mala.conf, die die Verzeichnisse enthält, die Sie hinzufügen möchten. Nachdem Sie /etc/ld.so.conf oder eine enthaltene Datei geändert haben, führen Sie /sbin/ldconfig aus, damit Ihre Änderungen wirksam werden (dies aktualisiert einen Cache).

(LD_LIBRARY_PATH gilt auch für viele andere Unices, einschließlich FreeBSD, NetBSD, OpenBSD, Solaris und Tru64. HP-UX hat SHLIB_PATH und Mac OS X hat DYLD_LIBRARY_PATH. /etc/ld.so.conf hat Analoga auf den meisten Unices, aber die Position und Syntax unterscheiden sich erheblich.)

41
Gilles

Wenn Sie LD_LIBRARY_PATH vermeiden möchten, können Sie dies auch während der Verknüpfung tun:

gcc -o exename -L/path/to/dynamiclib/ -lnameofLib \
    -Wl,-R/path/to/dynamiclib/ sourceCode1.c ...

Mit -Wl, ... werden zusätzliche Befehle an den Linker übergeben. In diesem Fall weisen Sie den Linker mit -R an, diesen Pfad als "Standardsuchpfad" für die .so zu speichern.

Ich mache mir Notizen zu vielen kleinen Tipps wie diesen auf meiner Website:

https://www.thanassis.space/tricks.html

15
ttsiodras

Dies zeigt an, dass libcorona nicht im richtigen Pfad installiert ist. Verschieben Sie das libcorona-Verzeichnis in den richtigen Pfad. Das Problem wird behoben.

0
Rathi