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

84

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

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

Сулла
источник
4
Можно отметить, что речь идет о платформе MS Windows.
cubuspl42

Ответы:

147

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

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

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

Энтони Уильямс
источник
4
После долгих поисков, IMO, я получил лучший ответ по этой причине, используя lib и dll. Спасибо
Джит
@Anthony Williams, когда вы сказали: «Для динамической библиотеки файл .lib содержит список экспортируемых функций и элементов данных из библиотеки, а также информацию о том, из какой DLL они были взяты.», Это тот файл .lib, называемый «import библиотека », которая отличается от обычных файлов .lib (« статическая библиотека »)?
звездочка
Да, это импортная библиотека
Энтони Уильямс
13

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

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

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

irsis
источник
8

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

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

Редактировать:

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

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

Связывание ǁ Статическое | DLL | LoadLibrary
========= ǁ =============== | ====================== | = ==================
Код API ǁ В вашем com- | В DLL | В DLL
живет ǁ наваленная программа | |
--------- ǁ --------------- | ---------------------- | - ------------------
Функция ǁ Прямая, май | Косвенный через таблицу | Косвенный через ваш
звонки ǁ не принимаются | заполняется автоматически | собственная функция ptrs
--------- ǁ --------------- | ---------------------- | - ------------------
Бремя ǁ Компилятор | Компилятор / ОС | Вы / ОС
Зубчатое колесо
источник
Под статически связанными библиотеками я имею в виду использование файла .lib и связывание .dll во время компиляции. Динамическое связывание - это связывание .dll во время выполнения с помощью функции libraryloaderex () Win32 API.
Sulla
6

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

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

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

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

user34660
источник
1

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

Quonux
источник