Статическая библиотека и Динамическая библиотека: Путаница - PullRequest
6 голосов
/ 11 февраля 2010

Мне нужно немного разъяснений в этой области. Я чувствую, что термины Static library & Dynamic Library неверны.

  • lib1.o + lib2.o + lib3.o -> "LinkerOutputFile" (исполняемый файл или библиотека).
  • Если этот «LinkerOutputFile» содержит код всех файлов lib1.o, lib2.o, lib3.o, тогда говорится, что «LinkerOutputFile» является связующим звеном «LinkerOutputFile» (исполняемый файл или библиотека). (Или)

  • Если «LinkerOutputFile» просто содержит ссылки и другую информацию о на lib1.o, lib2.o, lib3.o без кода этих файлов lib * .o. Затем он сказал, что "LinkerOutputFile" динамически связан.

Как это делает файлы lib * .o статической или динамической библиотекой? Это просто библиотечные файлы.

Или это то, что LinkerOutputFile - это библиотека, а не исполняемый файл, в зависимости от того, является ли она статически связанной или динамически связанной, называемой статической библиотекой или динамической библиотекой. Правда или Ложь?

Я знаю, что я не прав, потому что я знаю, что

На большинстве платформ в стиле Unix расширения

  • .a для статических библиотек (архивов) и
  • .so для разделяемых библиотек.

в Windows:

  • .dll обозначает общую библиотеку
  • .lib обозначает статическую или импортируемую библиотеку.

Но не могу понять, где я неправ. Также, пожалуйста, скажите мне, как Static library & Dynamic Library внутренне отличаются.

Кроме того, это из спецификации ABI:

В этой главе описывается объектный файл формат, называемый ELF (Исполняемый и Формат ссылок). Есть три основных типы объектных файлов.

A перемещаемый файл содержит код и данные подходит для связи с другим объектом файлы для создания исполняемого файла или общий объектный файл.

исполняемый файл содержит программу подходит для исполнения; файл указывает, как exec (BA_OS) создает образ процесса программы.

A общий объектный файл содержит код и данные, подходящие для связывания в двух контексты. Во-первых, редактор ссылок [см. ld (BA_OS)] обрабатывает общий объект файл с другими перемещаемыми и общими объектные файлы для создания другого объекта файл. Во-вторых, динамический компоновщик объединяет его с исполняемым файлом и другие общие объекты для создания Изображение процесса.

«общий объектный файл» - это другие слова для обозначения динамической библиотеки (имеет расширение * .so). Но как насчет «Статической библиотеки»? Это даже не упоминает об этом.

Есть ли разница между "Перемещаемым" и "Статической библиотекой" и "Библиотекой импорта"? Пожалуйста, уточните мне внутреннюю структуру.

Ответы [ 3 ]

10 голосов
/ 11 февраля 2010

.o файлы не являются любыми типами библиотечного файла. Это объект файл.

.a / .lib файлы связаны во время сборки. Они не могут быть заменены по факту. Это делает их статичными.

.so / .dll файлы связаны во время выполнения. Их можно заменить в любое время до начала исполнения. Это делает их динамичными.

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

4 голосов
/ 11 февраля 2010

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

Динамические библиотеки связаны во время выполнения - программа со ссылками на динамическую библиотеку будет загружаться и связываться с библиотекой при запуске (или по запросу).

Перемещаемая библиотека - это другое слово для динамической библиотеки. Когда вы связываетесь с динамической библиотекой, адреса функций, содержащихся в ней, вычисляются в зависимости от того, где библиотека загружена в память. Они являются «перемещаемыми», потому что адреса содержащихся функций не определяются во время соединения. (В статической библиотеке адреса вычисляются во время соединения.)

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

0 голосов
/ 11 февраля 2010

Допустим, у меня есть приложение , которое связывается с StaticLib.lib , а затем весь код из обоих приложений и StaticLib.lib будет в том же исполняемом файле. Это означает, что StaticLib.h содержит реализацию функций в нем.

Теперь, если я свяжу Приложение с DynamicLib.lib , тогда мое Приложение будет использовать функции, реализованные в DynamicLib.dll , что означает что DynamicLib.lib содержит ссылки, что-то вроде:

  • OpenWAV находится со смещением 1 в DynamicLib.dll
  • CloseWAV находится со смещением 2 в DynamicLib.dll и т.д.

Имя динамическое означает, что оно может быть загружено любым приложением, не связываясь с DynamicLib.lib, а вызывая LoadLibrary () и импортируя функции, экспортируемые из DLL вручную.

О Перемещаемом, ну в данный момент я не знаком со словом.

Я говорю как программист Windows, поэтому я не понимаю, что на самом деле происходит в Linux, но, судя по названию SO (Shared Objects), это то же самое, что DLL.

Надеюсь, мой ответ был полезен!

...