Статическая библиотека и библиотека Dynamic: Беспорядок

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

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

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

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

Или случается так, что, "LinkerOutputFile" является библиотекой вместо исполняемого файла затем в зависимости от ли ее статически связанный или динамично связанный его названная статическая библиотека или динамическая библиотека. TRUE или FALSE?

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

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

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

В Windows:

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

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

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

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

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

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

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

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

Есть ли какое-либо различие между, "Перемещаемая" и "Статическая Библиотека" и "Библиотека Импорта"? Разъясните меня с внутренней структурой.

6
задан pecker 11 February 2010 в 19:00
поделиться

3 ответа

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

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

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

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

10
ответ дан 8 December 2019 в 17:21
поделиться

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

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

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

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

4
ответ дан 8 December 2019 в 17:21
поделиться

Допустим, у меня есть приложение , которое связывается с 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.

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

0
ответ дан 8 December 2019 в 17:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: