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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Edit:

Немного поздно, но нет, вы не связываете .lib. Ну, вы ссылаетесь на lib с библиотекойloaderex. Но для реальной библиотеки, которую вы используете, вы предоставляете свои собственные привязки с помощью указателей функций 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

Ответ 4

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

Ответ 5

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

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

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

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