Sur Fedora, la liaison dynamique est effectuée par ld-linux.so.2. L'éditeur de liens dynamiques utilise /etc/ld.so.cache et /etc/ld.so.preload pour trouver les fichiers de bibliothèque.
Lancez ldconfig pour indiquer au système où libfoo doit chercher libbar.
ldconfig cherche dans /lib, /usr/lib et tout répertoire listé dans /etc/ld.so.conf. Vous pouvez vérifier quelles bibliothèques un programme utilise avec ldd.
Plus de détails sont disponibles sur les pages de manuel de chaque commande.
Voici un exemple d'application utilisant des bibliothèques partagées.
Programme.cc
#include "foo.h"
#include <iostream>
int main(int argc, char *argv[])
{
for (int i = 0; i < argc; ++i) {
std::cout << func_foo(argv[i]) << std::endl;
}
}
foo.h
#ifndef FOO_H
#define FOO_H
#include <string>
std::string func_foo(std::string const &);
#endif
foo.cc
#include "foo.h"
std::string func_foo(std::string const &arg)
{
return arg + "|" + __func__;
}
bar.h
#ifndef BAR_H
#define BAR_H
#include <string>
std::string func_bar();
#endif
bar.cc
#include "bar.h"
std::string func_bar()
{
return __func__;
}
Construire avec libfoo.so comme bibliothèque partagée.
g++ -Wall -Wextra -fPIC -shared foo.cc -o libfoo.so
g++ -lfoo -L./ -Wall -Wextra program.cc foo.h -o program
programme ldd
...
libfoo.so => non trouvé
Mise à jour de /etc/ld.so.cache
sudo ldconfig /home/tobias/projects/stubs/so/
ldd montre que l'éditeur de liens dynamiques trouve libfoo.so
programme ldd
...
libfoo.so => /home/tobias/projets/stubs/so/libfoo.so (0x00007f0bb9f15000)
Ajouter un appel à libbar.so dans libfoo.so
Nouveau foo.cc
#include "foo.h"
#include "bar.h"
std::string func_foo(std::string const &arg)
{
return arg + "|" + __func__ + "|" + func_bar();
}
Construire libbar.so et reconstruire libfoo.so
g++ -Wall -Wextra -fPIC -shared bar.cc -o libbar.so
g++ -Wall -Wextra -fPIC -shared libbar.so foo.cc -o libfoo.so
ldd libfoo.so
...
libbar.so => non trouvé
programme ldd
...
libfoo.so => /home/tobias/projets/stubs/so/libfoo.so (0x00007f49236c7000)
libbar.so => non trouvé
Ceci montre que l'éditeur de liens dynamiques trouve toujours libfoo.so mais pas libbar.so.
Mettez à nouveau à jour /etc/ld.so.cache et revérifiez.
sudo ldconfig /home/tobias/projects/stubs/so/
ldd libfoo.so
...
libbar.so => /home/tobias/projets/stubs/so/libbar.so (0x00007f935e0bd000)
programme ldd
...
libfoo.so => /home/tobias/projets/stubs/so/libfoo.so (0x00007f2be4f11000)
libbar.so => /home/tobias/projets/stubs/so/libbar.so (0x00007f2be4d0e000)
On trouve à la fois libfoo.so et libbar.so.
Notez que cette dernière étape n'a aucun effet sur le programme d'application. Si vous êtes vraiment strict, exécuter ldconfig est une sorte de relier. Bizarre ou pas, l'éditeur de liens a besoin de connaître les dépendances des bibliothèques qu'il lie. Il y a beaucoup d'autres façons d'implémenter ceci mais c'est celle qui a été choisie.