То, что внутри.файл lib для статической библиотеки, статически и динамически связаны динамическая библиотека динамическая библиотека?


Что находится внутри .файл lib для статической библиотеки, статически и динамически связаны динамическая библиотека динамическая библиотека?

Почему нет необходимости в a .lib-файл в динамически связанной динамической библиотеке, а также в статической компоновке.файл lib-это не что иное, как a .obj файл со всеми методами. Это правильно?

5 63

5 ответов:

для статической библиотеки .lib-файл содержит весь код и данные для библиотеки. Затем компоновщик определяет необходимые ему биты и помещает их в конечный исполняемый файл.

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

вам не нужно .lib-файл для использования динамической библиотеки, но без нее вы не можете обрабатывать функции из DLL как обычные функции в своем коде. Вместо этого вы должны вручную вызвать LoadLibrary для загрузки DLL (и FreeLibrary когда вы закончите), и GetProcAddress для получения адреса функции или элемента данных в файл DLL. Затем необходимо привести возвращенный адрес к соответствующему указателю на функцию, чтобы использовать его.

Я нашел следующее ответ от Ганса тоже полезно here.It очищает воздух, что может быть два типа файлов lib.

файл LIB используется для построения вашей программы, он существует только в вашей сборке машина и вы не грузите его. Есть два вида. Статическая ссылка библиотека-это мешок .obj-файлы, собранные в один файл. Этот компоновщик выбирает любые куски кода из файла, когда это необходимо решить внешний идентификатор.

но более актуальным для библиотеки DLL, а lib-файл можно также библиотеку импорта. Это тогда простой небольшой файл, который включает в себя имя DLL и a список всех функций, экспортируемых библиотекой DLL. Вам нужно будет предоставить это к компоновщику, когда вы строите программу, которая использует DLL, так что это знает, что внешний идентификатор на самом деле является функцией, экспортируемой файл DLL. Компоновщик использует библиотеку импорта для добавления записей в импорт таблицы для exe-файла. Который затем, в свою очередь, используется Windows в выполнения выясните, какие библиотеки DLL необходимо загрузить для запуска программы.

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

Я не уверен в "динамически связанных динамических библиотеках" (загружается программно). Вы даже ссылку .Либ в таком случае?

Edit:

немного с опозданием, но нет, вы не связать .движение за освобождение. Ну, вы ссылаетесь на lib с libraryloaderex в нем. Но для реальной библиотеки, которую вы используете, вы предоставляете свои собственные привязки через указатели функций C, и loadlibrary заполняет их.

вот резюме:

Linking  ǁ Static        | DLL                  | LoadLibrary
=========ǁ===============|======================|===================
API code ǁ In your com-  | In the DLL           | In the DLL
lives    ǁ piled program |                      |
---------ǁ---------------|----------------------|-------------------
Function ǁ Direct, may   | Indirect via table   | Indirect via your
calls    ǁ be elided     | filled automatically | own function ptrs
---------ǁ---------------|----------------------|-------------------
Burden   ǁ Compiler      | Compiler/OS          | You/OS

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

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

первоначально были только статические библиотеки. Для статические библиотеки .lib файл содержит obj файлы. Каждый obj-файл является выходом одного и только одного входного файла исходного кода компилятора. Файл lib-это просто набор связанных файлов obj, так же как и размещение файлов obj в каталоге. Это по существу то, что файл lib, библиотека obj-файлов. Для статической ссылки все obj-файлы, используемые исполняемым файлом, объединяются в один файл. Сравните это с динамической ссылкой, в которой исполняемый файл находится в файле, отдельном от другого кода использует.

чтобы реализовать динамическое связывание, Microsoft изменила использование файлов lib таким образом, что они ссылаются на файл dll вместо расположения в файле obj. Кроме того, вся информация, которая находится в библиотеке для статической ссылки, такая же, как и для динамической ссылки. Они все одинаковы, насколько информация в них, за исключением того, что файл lib для динамической ссылки указывает файл dll.

в dll-это "вещи", такие как exe (могут быть любые данные, импорт, экспорт, чтение/запись/исполняемые разделы), но разница в том, что exe-файл экспортирует только точку входа (функцию), но экспортирует одну/много функций dll.