Sie können LD_LIBRARY_PATH so einstellen, dass der dynamische Linker weiß, wo er suchen muss. Es gibt jedoch bessere Optionen. Sie können Ihre gemeinsam genutzte Bibliothek an einem der Standardorte ablegen. Eine Liste dieser Orte finden Sie unter /etc/ld.so.conf
(Linux) und /usr/bin/crle
(Solaris)
Sie können -R <path>
beim Erstellen Ihrer Binärdatei an den Linker übergeben, der <path>
der Liste der für Ihre gemeinsam genutzte Bibliothek durchsuchten Verzeichnisse hinzugefügt wird . Hier ist ein Beispiel. Zeigen Sie zunächst das Problem:
libtest.h:
void hello_world(void);
libtest.c:
#include <stdio.h>
void hello_world(void) {
printf("Hello world, I'm a library!\n");
}
Hallo c:
#include "libtest.h"
int main(int argc, char **argv) {
hello_world();
}
Makefile (Tabs müssen verwendet werden):
all: hello
hello: libtest.so.0
%.o: %.c
$(CC) $(CFLAGS) -fPIC -c -o $@ $<
libtest.so.0.0.1: libtest.o
$(CC) -shared -Wl,-soname,libtest.so.0 -o libtest.so.0.0.1 libtest.o
libtest.so.0: libtest.so.0.0.1
ln -s $< $@
clean:
rm -f hello libtest.o hello.o libtest.so.0.0.1 libtest.so.0
Lass es uns machen:
$ make
cc -fPIC -c -o libtest.o libtest.c
cc -shared -Wl,-soname,libtest.so.0 -o libtest.so.0.0.1 libtest.o
ln -s libtest.so.0.0.1 libtest.so.0
cc hello.c libtest.so.0 -o hello
$ ./hello
./hello: error while loading shared libraries: libtest.so.0: cannot open shared object file: No such file or directory
Wie man es repariert? Fügen Sie -R <path>
den Linker-Flags hinzu (hier durch Einstellen LDFLAGS
).
$ make clean
(...)
$ make LDFLAGS="-Wl,-R -Wl,/home/maciej/src/tmp"
(...)
cc -Wl,-R -Wl,/home/maciej/src/tmp hello.c libtest.so.0 -o hello
$ ./hello
Hello world, I'm a library!
Wenn Sie sich die Binärdatei ansehen, sehen Sie, dass sie Folgendes benötigt libtest.so.0
:
$ objdump -p hello | grep NEEDED
NEEDED libtest.so.0
NEEDED libc.so.6
Die Binärdatei sucht, abgesehen von den Standardverzeichnissen, im angegebenen Verzeichnis nach ihren Bibliotheken:
$ objdump -p hello | grep RPATH
RPATH /home/maciej/src/tmp
Wenn die Binärdatei im aktuellen Verzeichnis angezeigt werden soll, können Sie den RPATH auf festlegen $ORIGIN
. Dies ist etwas knifflig, da Sie sicherstellen müssen, dass das Dollarzeichen nicht von make interpretiert wird. Hier ist eine Möglichkeit, dies zu tun:
$ make CFLAGS="-fPIC" LDFLAGS="-Wl,-rpath '-Wl,\$\$ORIGIN'"
$ objdump -p hello | grep RPATH
RPATH $ORIGIN
$ ./hello
Hello world, I'm a library!
echo $LD_LIBRARY_PATH
ist auf meinem Rechner leer :(