В Fedora динамическое связывание выполняется ld-linux.so.2.
Динамический компоновщик использует /etc/ld.so.cache и /etc/ld.so.preload для поиска файлов библиотеки.
Запустите ldconfig, чтобы сообщить системе, где libfoo должна искать libbar.
ldconfig ищет в / lib, / usr / lib и любом каталоге, указанном в /etc/ld.so.conf.
Вы можете проверить, какие библиотеки программа использует с ldd.
Более подробная информация доступна на страницах руководства по каждой команде.
Вот пример приложения, использующего разделяемые библиотеки.
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__;
}
Сборка с использованием libfoo.so в качестве общей библиотеки.
g ++ -Wall -Wextra -fPIC -shared foo.cc -o libfoo.so
g ++ -lfoo -L./ -Wall -Wextra program.cc foo.h -o программа
Программа LDD
...
libfoo.so => не найден
Обновление /etc/ld.so.cache
sudo ldconfig / home / tobias / проекты / заглушки / so /
ldd показывает, что динамический компоновщик находит libfoo.so
Программа LDD
...
libfoo.so => /home/tobias/projects/stubs/so/libfoo.so (0x00007f0bb9f15000)
Добавить вызов libbar.so в libfoo.so
Новый foo.cc
#include "foo.h"
#include "bar.h"
std::string func_foo(std::string const &arg)
{
return arg + "|" + __func__ + "|" + func_bar();
}
Сборка libbar.so и пересборка 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 => не найден
Программа LDD
...
libfoo.so => /home/tobias/projects/stubs/so/libfoo.so (0x00007f49236c7000)
libbar.so => не найден
Это показывает, что динамический компоновщик все еще находит libfoo.so, но не libbar.so
Снова обновите /etc/ld.so.cache и перепроверьте.
sudo ldconfig / home / tobias / проекты / заглушки / so /
ldd libfoo.so
...
libbar.so => /home/tobias/projects/stubs/so/libbar.so (0x00007f935e0bd000)
Программа LDD
...
libfoo.so => /home/tobias/projects/stubs/so/libfoo.so (0x00007f2be4f11000)
libbar.so => /home/tobias/projects/stubs/so/libbar.so (0x00007f2be4d0e000)
Найдены как libfoo.so, так и libbar.so.
Обратите внимание, что этот последний шаг не влияет на прикладную программу.
Если вы действительно строгий запуск ldconfig, это своего рода перекомпоновка.
Странно или нет, компоновщик должен знать зависимости библиотек, на которые он ссылается.
Есть много других способов реализовать это, но это было выбрано.