Bien que vous puissiez définir LD_LIBRARY_PATH pour laisser l’éditeur de liens dynamique savoir où regarder, de meilleures options existent. Vous pouvez placer votre bibliothèque partagée à l’un des emplacements standard, voir /etc/ld.so.conf(sous Linux) et /usr/bin/crle(sous Solaris) pour obtenir la liste de ces emplacements.
Vous pouvez passer -R <path>à l'éditeur de liens lors de la construction de votre binaire, ce qui s'ajoutera <path>à la liste des répertoires analysés pour votre bibliothèque partagée. Voici un exemple. Tout d'abord, montrant le problème:
libtest.h:
void hello_world(void);
libtest.c:
#include <stdio.h>
void hello_world(void) {
  printf("Hello world, I'm a library!\n");
}
Bonjour c:
#include "libtest.h"
int main(int argc, char **argv) {
  hello_world();
}
Makefile (les onglets doivent être utilisés):
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
Courons le:
$ 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
Comment le réparer? Ajouter -R <path>aux drapeaux de l'éditeur de liens (ici, par paramètre 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!
En regardant le binaire, vous pouvez voir qu'il a besoin de libtest.so.0:
$ objdump -p hello | grep NEEDED
  NEEDED               libtest.so.0
  NEEDED               libc.so.6
Le binaire cherchera ses bibliothèques, en dehors des emplacements standard, dans le répertoire spécifié:
$ objdump -p hello | grep RPATH
  RPATH                /home/maciej/src/tmp
Si vous voulez que le fichier binaire regarde dans le répertoire en cours, vous pouvez définir le RPATH sur $ORIGIN. C'est un peu délicat, car vous devez vous assurer que le signe dollar n'est pas interprété par make. Voici une façon de le faire:
$ 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_PATHest vide sur ma machine :(