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

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

5 ответов


существуют статические библиотеки (LIB) и динамические библиотеки (DLL).

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

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

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


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


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


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

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

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


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

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

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