При связывании бинарной или разделяемой библиотеки, почему я должен передавать разделяемые библиотеки, от которых я зависим? - PullRequest
1 голос
/ 30 октября 2019

Допустим, я пытаюсь создать двоичный файл myprogram. myprogram включает в себя файл foo.h, в котором объявлены некоторые функции;эти функции определены в libfoo.so. Поэтому при сборке myprogram я передаю libfoo.so компоновщику ... нет, не имя "libfoo.so", а фактический файл общей библиотеки.

У меня вопрос, почему этонеобходимо? Насколько я понимаю, общая библиотека понадобится только во время выполнения, когда динамический компоновщик загрузит ее в память и исправит все ссылки на нее в myprogram. Что делает статический компоновщик с libfoo.so, кроме внесения его имени в список общих библиотек?

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

Что статический компоновщик делает с libfoo.so, кроме внесения его имени в список общих библиотек?

Для создания динамически связанного исполняемого файла это в основном все! Это также подтверждает, что с версиями общих библиотек, доступных во время соединения, все неопределенные ссылки на символы определяются одной из общих библиотек. Это свойство позволяет вам проводить осмысленные тесты во время сборки (стиль автоконфигурации), например, чтобы убедиться, что libfoo.so является достаточно новой версией, чтобы в ней была функция bar.

0 голосов
/ 30 октября 2019

Вы путаете статические и динамически связанные библиотеки. Динамические библиотеки полагаются на модуль времени выполнения, загружаемый в память, и получают доступ к тому, что ему нужно, с помощью экспортированных методов. Статические библиотеки фактически встроены непосредственно в ваш двоичный файл, а не загружаются отдельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...