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

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

Каким образом нет никакой потребности в .lib файле в динамично связанной динамической библиотеке и также что в статическом подключении, .lib файл является только .obj файлом со всеми методами. Это корректно?

75
задан Enigma 31 January 2013 в 19:05
поделиться

3 ответа

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

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

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

131
ответ дан 24 November 2019 в 11:35
поделиться

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

Я не уверен насчет «динамически подключаемых динамических библиотек» (загружаемых программно). Вы вообще связываетесь с .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
7
ответ дан 24 November 2019 в 11:35
поделиться

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

1
ответ дан 24 November 2019 в 11:35
поделиться
Другие вопросы по тегам:

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