Файлы DLL и LIB - что и почему?

Я очень мало знаю о библиотеках DLL и LIB, кроме того, что они содержат жизненно важный код, необходимый для правильной работы программы - библиотеки. Но почему компиляторы вообще их генерируют? Не было бы проще просто включить весь код в один исполняемый файл? А в чем разница между DLL и LIB?


person Xonara    schedule 27.05.2009    source источник
comment
fileinfo.com/extension/lib   -  person Shiwangini    schedule 01.03.2020


Ответы (5)


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

Библиотеки используются, потому что у вас может быть код, который вы хотите использовать во многих программах. Например, если вы пишете функцию, которая подсчитывает количество символов в строке, эта функция будет полезна во многих программах. Как только вы добьетесь правильной работы этой функции, вам не захочется перекомпилировать код каждый раз, когда вы ее используете, поэтому вы помещаете исполняемый код для этой функции в библиотеку, а компоновщик может извлечь и вставить скомпилированный код в вашу программу. . По этой причине статические библиотеки иногда называют «архивами».

Динамические библиотеки делают еще один шаг вперед. Кажется расточительным иметь несколько копий библиотечных функций, занимающих место в каждой из программ. Почему они не могут использовать одну копию функции? Для этого нужны динамические библиотеки. Вместо того, чтобы встраивать код библиотеки в вашу программу, когда она скомпилирована, ее можно запустить, отображая ее в вашу программу по мере ее загрузки в память. Несколько программ, работающих одновременно и использующих одни и те же функции, могут использовать одну копию, что экономит память. Фактически, вы можете загружать динамические библиотеки только по мере необходимости, в зависимости от пути прохождения вашего кода. Нет смысла в том, чтобы процедуры принтера занимали память, если вы не печатаете. С другой стороны, это означает, что у вас должна быть установлена ​​копия динамической библиотеки на каждом компьютере, на котором работает ваша программа. Это создает свой собственный набор проблем.

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

person Charles E. Grant    schedule 27.05.2009
comment
Оказывается, .LIB файлы могут быть либо статическими библиотеками (содержащими объектные файлы), либо библиотеками импорта (содержащими символы, позволяющие компоновщику связываться с DLL). Мне интересно, почему это так. - person Lumi; 21.06.2011
comment
хорошее объяснение! Код является общим, а данные (по умолчанию) не разделяются между приложениями, использующими Dll. - person mox; 03.07.2012
comment
@Lumi: Хороший момент. Что касается DLL, у нас есть два типа связывания. Неявное связывание, когда у нас есть .lib файл, предоставленный создателем DLL вместе с соответствующими заголовками; этот .lib - просто дескриптор целевой DLL, он содержит адреса, точку входа и т. д., но не код. Это .lib необходимо передать компоновщику. Второй - явное связывание, когда мы используем DLL, вручную загружая ее с помощью функции LoadLibrary. В этом типе нам не нужен этот .lib файл, но мы должны приложить немного усилий, чтобы найти экспорт DLL, их адреса и вызвать эти функции через указатели. - person itachi; 09.11.2019
comment
извините, если в мой проект включены файлы заголовков (.h) и c (.c), нужны ли библиотеки для компиляции и запуска исполняемого файла? Я не говорю о плюсах и минусах этого, просто если он сможет скомпилировать и запустить - person platinoob_; 24.12.2020

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

person mox    schedule 03.07.2012
comment
Аспект безопасности был для меня новым. Верны ли приведенные выше рассуждения в случае, когда приложение C # вызывает собственную неуправляемую dll C ++? - person Martin; 05.12.2012
comment
Но LIB тоже изолирован, не так ли? Таким образом, злоумышленник может просто проанализировать LIB. Или это распространенный сценарий, когда LIB недоступен для общественности? - person Nick Russler; 01.03.2014
comment
LIB также изолирован, что касается процесса компиляции, но как только компоновщик соединяет части вместе, LIB становится частью EXE и не может быть отделен от вашего собственного кода. - person mox; 02.03.2014

Одной из важных причин для создания DLL / LIB, а не просто компиляции кода в исполняемый файл, является повторное использование и перемещение. Среднее приложение Java или .NET (например), скорее всего, будет использовать несколько сторонних библиотек (или фреймворков). Гораздо проще и быстрее просто скомпилировать предварительно созданную библиотеку, вместо того, чтобы компилировать весь сторонний код в свое приложение. Компиляция вашего кода в библиотеки также способствует хорошему дизайну, например проектирование ваших классов для использования в различных типах приложений.

person Andy White    schedule 27.05.2009

DLL - это библиотека функций, которые используются другими исполняемыми программами. Просто загляните в свой каталог windows / system32, и вы найдете их десятки. Когда ваша программа создает DLL, она также обычно создает файл lib, чтобы программа application * .exe могла разрешать символы, объявленные в DLL.

.Lib - это библиотека функций, которые статически связаны с программой - они НЕ используются другими программами. Каждая программа, которая связывается с файлом * .lib, имеет весь код в этом файле. Если у вас есть две программы A.exe и B.exe, которые связаны с C.lib, то каждая из A и B будет содержать код в C.lib.

То, как вы создаете библиотеки DLL и библиотеки, зависит от используемого компилятора. Каждый компилятор делает это по-своему.

person Vinodhini Ramasamy    schedule 19.01.2016

Еще одно отличие заключается в производительности.

Поскольку DLL загружается во время выполнения с помощью .exe (s), .exe (s) и DLL работают с концепцией общей памяти, и, следовательно, производительность низкая по сравнению со статическим связыванием.

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

person Girish Reddyvari    schedule 08.09.2017