Подтвердить что ты не робот

Как статические библиотеки связаны с зависимостями?

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

Спасибо

4b9b3361

Ответ 1

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

Этот поток обсуждает, как это происходит в Linux.

Ответ 2

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

Ответ 3

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

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

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