W Fedorze łączenie dynamiczne jest wykonywane przez ld-linux.so.2. Dynamiczny linker używa /etc/ld.so.cache i /etc/ld.so.preload, aby znaleźć pliki biblioteki.
Uruchom ldconfig, aby poinformować system, w którym libfoo powinien szukać libbar.
ldconfig wygląda w/lib,/usr/lib i dowolnym katalogu wymienionym w /etc/ld.so.conf. Możesz sprawdzić, które biblioteki program używa z LDD.
Więcej szczegółów jest dostępnych na stronach podręcznika dla każdego polecenia.
Oto przykład aplikacji korzystającej z bibliotek współdzielonych.
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__;
}
Kompilacja z libfoo.so jako biblioteką współdzieloną.
g ++ -Wall -Wextra -fPIC -shared foo.cc -o libfoo.so
g ++ -lfoo -L./ -Wall -Wextra program.cc Foo.h -o Program
Program LDD
...
libfoo.so => nie znaleziono
Aktualizacja /etc/ld.so.cache
sudo ldconfig/home/Tobias/projekty/en/tak/
LDD pokazuje, że dynamiczny linker znajdzie libfoo.so
program ldd
...
libfoo.so => /home/tobias/projects/stubs/so/libfoo.so (0x00007f0bb9f15000)
Dodaj wezwanie do libbar.so w libfoo.so
Nowym foo.cc
#include "foo.h"
#include "bar.h"
std::string func_foo(std::string const &arg)
{
return arg + "|" + __func__ + "|" + func_bar();
}
Budowa libbar.so i odbudować 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 => Nie znaleziono
Program LDD
...
libfoo.so => /home/tobias/projects/stubs/so/libfoo.so (0x00007f49236c7000)
libbar.so => Nie znaleziono
To pokazuje, że dynamiczny linker nadal znajduje libfoo.so ale nie libbar. więc
Ponownie zaktualizuj /etc/ld.so.cache i ponownie sprawdź.
sudo ldconfig/home/Tobias/projekty/en/tak/
LDD libfoo.so
...
libbar.so => /home/tobias/projects/stubs/so/libbar.so (0x00007f935e0bd000)
Program LDD
...
libfoo.so => /home/tobias/projects/stubs/so/libfoo.so (0x00007f2be4f11000)
libbar.so => / home/Tobias/projekty/stubs/so/libbar.so (0x00007f2be4d0e000)
B znaleziono inne libfoo.so i libbar.so.
Uwaga: ten ostatni krok nie ma wpływu na program aplikacji. Jeśli naprawdę ściśle działasz, ldconfig jest w rodzaju ponownego łączenia. Dziwne czy nie, linker musi znać zależności bibliotek, do których prowadzi. Istnieje wiele innych sposobów wdrożenia tego, ale zostało to wybrane.
Czy możesz umieścić minimalną konfigurację, która powiela problem? Komentarze vitauta następujące po poście wydają się opisywać ten sam proces i nie dochodzi do tego samego problemu. Może jeśli postawisz proste kroki, możemy pomóc w odpowiedzi na pytanie? –