In Fedora il collegamento dinamico viene eseguito da ld-linux.so.2. Il linker dinamico usa /etc/ld.so.cache e /etc/ld.so.preload per trovare i file della libreria.
Eseguire ldconfig per indicare al sistema dove libfoo deve cercare libbar.
ldconfig cerca in/lib,/usr/lib e in qualsiasi directory elencata in /etc/ld.so.conf. Puoi controllare quali librerie un programma usa con ldd.
Ulteriori dettagli sono disponibili sulle pagine di manuale per ciascun comando.
Ecco un esempio di un'applicazione che utilizza le librerie condivise.
Program.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__;
}
Costruire con libfoo.so come libreria condivisa.
g ++ -Wall -Wextra -fPIC -shared foo.cc -o libfoo.so
g ++ -lfoo -L./ -Wall -Wextra program.cc foo.h -o programma
programma ldd
...
libfoo.so => non trovato
Aggiornamento /etc/ld.so.cache
sudo ldconfig/home/Tobias/progetti/stub/SO/
LDD mostra che il linker dinamico trova libfoo.so
programma ldd
...
libfoo.so => /home/tobias/projects/stubs/so/libfoo.so (0x00007f0bb9f15000)
Aggiungere una chiamata a libbar.so in libfoo.so
Nuovo foo.cc
#include "foo.h"
#include "bar.h"
std::string func_foo(std::string const &arg)
{
return arg + "|" + __func__ + "|" + func_bar();
}
Corporatura libbar.so e ricostruire 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 trovato
programma ldd
...
libfoo.so => /home/tobias/projects/stubs/so/libfoo.so (0x00007f49236c7000)
libbar.so => non trovato
Questo dimostra che il linker dinamico trova ancora libfoo.so ma non libbar. so
Ancora aggiornare /etc/ld.so.cache e ricontrollare.
sudo ldconfig/home/Tobias/progetti/stub/SO/
LDD libfoo.so
...
libbar.so => /home/tobias/projects/stubs/so/libbar.so (0x00007f935e0bd000)
programma ldd
...
libfoo.so => /home/tobias/projects/stubs/so/libfoo.so (0x00007f2be4f11000)
libbar.so => / home/Tobias/progetti/stubs/so/libbar.so (0x00007f2be4d0e000)
B si trovano libhoo.so e libbar.so.
Nota questo ultimo passaggio non ha alcun effetto sul programma applicativo. Se sei veramente rigido, ldconfig è una specie di ricollegamento. Strano o meno il linker deve conoscere le dipendenze delle librerie che collega. Ci sono molti altri modi per implementarlo ma questo è stato scelto.
Puoi pubblicare una configurazione minima che riproduce il problema? I commenti di vitaut che seguono il suo post sembrano descrivere lo stesso processo e non arrivano allo stesso problema. Forse se metti dei semplici passaggi, potremmo aiutarti a rispondere alla domanda? –