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

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

5 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам