Как статические библиотеки связываются с зависимостями? - PullRequest
14 голосов
/ 21 октября 2011

Скажи, у меня есть libA.Например, от libSomething зависит тот простой факт, что не встроенный метод libA вызывает метод из libSomething.h.Как взаимосвязь зависимости в этом случае?Должна ли libA статически ссылаться на libSomething при компиляции, или пользователю libA (приложению, использующему libA) необходимо ссылаться как на libA, так и на libSomething?

Спасибо

Ответы [ 3 ]

14 голосов
/ 21 октября 2011

Статическое связывание - это просто копирование целых элементов (функций, констант и т. Д.) В полученный исполняемый файл. Если код статической библиотеки содержит ссылки на некоторые элементы общей библиотеки, эти ссылки станут зависимостями в конечном исполняемом файле. То же самое верно, если вы связываете библиотеку вместо исполняемого файла.

В этой теме обсуждается, как это происходит в Linux.

6 голосов
/ 21 октября 2011

Статическая библиотека - это более или менее простой архив несвязанных двоичных объектных файлов (* .o или * .obj), при компиляции архива проверка зависимостей не производится. Когда один связывает двоичный исполняемый файл (или разделяемую библиотеку / DLL), компоновщик проверяет все необходимые зависимости и только тогда предупредит вас о любых проблемах.

4 голосов
/ 21 октября 2011

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

Процесс сборки передает файлы компоновщику до тех пор, пока не будут разрешены все символы.Здесь нет списков физических зависимостей, только списки символов для разрешения.Это позволяет разрешать символы с использованием разных библиотек.Например, можно использовать библиотеку Windows для решения конкретных проблем Windows;библиотека Linux для конкретных проблем Linux.Это явно не означает, что программа зависит от библиотеки Windows;это также может зависеть от Linux.

Некоторые компиляторы могут генерировать списки зависимостей, обычно для использования в процессе сборки.Тем не менее, конечная ответственность лежит на программисте.

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