Мне нужно мало разъяснения в этой области. Я чувствую что условия Static library
& Dynamic Library
не корректны.
Если этот "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 расширение). Но что относительно "Статической библиотеки"? Это даже не упоминает это.
Есть ли какое-либо различие между, "Перемещаемая" и "Статическая Библиотека" и "Библиотека Импорта"? Разъясните меня с внутренней структурой.
.o
файлы не являются каким-либо файлом библиотеки.Это файл объекта . Файлы
.a
/ .lib
связываются во время сборки. Их нельзя заменить постфактум. Это делает их статичными. Файлы
.so
/ .dll
связаны во время выполнения. Их можно заменить в любое время до начала выполнения. Это делает их динамичными.
Перемещение относится к размещению двоичного файла в памяти; код из статических библиотек интегрирован с двоичным файлом и поэтому не может быть перемещен независимо.
Статические библиотеки содержат код, который копируется в исполняемый файл. Код в библиотеке, на который не ссылается ваша программа, будет удален. Программа только со статическими библиотеками не имеет зависимостей во время выполнения.
Динамические библиотеки подключаются во время выполнения - программа со ссылками на динамическую библиотеку загружается и связывается с библиотекой при запуске (или по запросу).
Перемещаемая библиотека - это другое слово для динамической библиотеки. Когда вы связываетесь с динамической библиотекой, адреса содержащихся в ней функций вычисляются в зависимости от того, где библиотека загружена в память. Они «перемещаемые», потому что адреса содержащихся в них функций не определяются во время компоновки. (В статической библиотеке адреса вычисляются во время компоновки.)
Объектный файл (.o) содержит скомпилированный код, но не содержит конечных адресов всех функций. Связывание - это процесс, в котором компоновщик просматривает все объектные файлы и вычисляет правильный адрес для каждой вызываемой функции.
Допустим, у меня есть приложение , которое связывается с StaticLib.lib , затем весь код из моего приложения и StaticLib.lib будет в том же исполняемом файле. Это означает, что StaticLib.h содержит в себе реализацию функций.
Теперь, если я свяжу Приложение с DynamicLib.lib , тогда мое Приложение будет использовать функции, реализованные в DynamicLib.dll , что означает что DynamicLib.lib содержит ссылки, например:
Имя динамическое означает, что оно может быть загружено любым приложением, на самом деле не путем связывания с DynamicLib.lib, а путем вызова LoadLibrary () и импорта функций, экспортированных из DLL вручную.
О перемещаемом, ну в данный момент я не знаком с этим словом.
Я говорю как программист Windows, поэтому не знаю, что на самом деле происходит в Linux, но, судя по названию, SO (Shared Objects) - это то же самое, что и библиотеки DLL.
Надеюсь, мой ответ был полезен!