Что находится внутри файла .lib статической библиотеки, статически связанной динамической библиотеки и динамически связанной динамической библиотеки?
Почему нет необходимости в файле .lib в динамически подключаемой динамической библиотеке, а также в том, что при статической компоновке файл .lib представляет собой не что иное, как файл .obj со всеми методами. Это правильно?
c++
dll
linker
static-libraries
Сулла
источник
источник
Ответы:
Для статической библиотеки файл .lib содержит весь код и данные для библиотеки. Затем компоновщик определяет нужные биты и помещает их в окончательный исполняемый файл.
Для динамической библиотеки файл .lib содержит список экспортируемых функций и элементов данных из библиотеки, а также информацию о том, из какой DLL они были взяты. Когда компоновщик создает окончательный исполняемый файл, тогда, если какая-либо из функций или элементов данных из библиотеки используется, компоновщик добавляет ссылку на DLL (в результате чего она автоматически загружается Windows) и добавляет записи в таблицу импорта исполняемого файла, чтобы что вызов функции перенаправляется в эту DLL.
Для использования динамической библиотеки вам не нужен файл .lib, но без него вы не сможете рассматривать функции из DLL как обычные функции в вашем коде. Вместо этого вы должны вручную вызвать
LoadLibrary
загрузку DLL (иFreeLibrary
когда вы закончите) иGetProcAddress
получить адрес функции или элемента данных в DLL. Затем вы должны преобразовать возвращенный адрес в соответствующий указатель на функцию, чтобы использовать его.источник
Я нашел следующий ответ от Ганса, который также полезен здесь. Он очищает воздух от того, что может быть два типа файлов lib.
источник
В статической библиотеке файл lib содержит фактический объектный код для функций, предоставляемых библиотекой. В общей версии (которую вы назвали статически связанной динамической библиотекой) кода ровно столько, чтобы установить динамическое связывание во время выполнения.
Я не уверен насчет «динамически подключаемых динамических библиотек» (загружаемых программно). Вы вообще связываетесь с .lib в этом случае?Редактировать:
Немного поздно, но нет, вы не связываете .lib. Ну, вы ссылаетесь на библиотеку с libraryloaderex в ней. Но для реальной библиотеки, которую вы используете, вы предоставляете свои собственные привязки через указатели функций C, а loadlibrary заполняет их.
Вот краткое изложение:
источник
Компоновщик читает файлы lib, а во время выполнения используется файл dll. Файл lib практически бесполезен во время выполнения, а компоновщик не может читать файл dll (кроме, возможно, несущественной здесь манеры).
Различия между использованием файлов lib для статической и динамической компоновки могут сбивать с толку, но если вы немного разберетесь в истории, это станет очень ясным.
Изначально были только статические библиотеки. Для статической библиотеки файл .lib содержит файлы obj. Каждый файл obj является выходом одного и только одного входного файла исходного кода компилятора. Файл lib - это просто набор связанных файлов obj, очень похоже на размещение файлов obj в каталоге. По сути, это и есть файл lib, библиотека файлов obj. Для статической ссылки все файлы obj, которые использует исполняемый файл, объединяются в один файл. Сравните это с динамической ссылкой, в которой исполняемый файл находится в файле отдельно от другого кода, который он использует.
Чтобы реализовать динамическое связывание, Microsoft изменила использование файлов lib так, чтобы они ссылались на файл dll, а не на места в файле obj. В остальном вся информация, которая находится в библиотеке для статической ссылки, такая же, как и для динамической ссылки. Все они одинаковы в том, что касается информации в них, за исключением того, что файл lib для динамической ссылки указывает файл dll.
источник
В dll есть «вещи», как в exe (могут быть любые данные, импорт, экспорт, чтение / запись / исполняемые разделы), но разница в том, что exe-файл экспортирует только точку входа (функцию), но экспорт dll. / много функций.
источник