Что находится внутри .lib файла статической библиотеки, статически связанной динамической библиотеки и динамически связанной динамической библиотеки? - PullRequest
74 голосов
/ 15 июля 2010

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

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

Ответы [ 5 ]

122 голосов
/ 15 июля 2010

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

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

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

12 голосов
/ 08 мая 2015

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

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

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

7 голосов
/ 15 июля 2010

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

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

Edit:

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

Вот краткое изложение:

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
5 голосов
/ 22 апреля 2016

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

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

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

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

1 голос
/ 15 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...