Я очень мало знаю о DLL и LIB, кроме того, что они содержат жизненно важный код, необходимый для правильной работы программы - библиотек. Но почему компиляторы генерируют их вообще? Было бы проще просто включить весь код в один исполняемый файл? И какая разница между DLL и LIB?
Файлы DLL и LIB - что и почему?
Ответ 1
Существуют статические библиотеки (LIB) и динамические библиотеки (DLL).
Библиотеки используются, потому что у вас может быть код, который вы хотите использовать во многих программах. Например, если вы пишете функцию, которая подсчитывает количество символов в строке, эта функция будет полезна в большом количестве программ. После правильной работы этой функции вы не хотите перекомпилировать код каждый раз, когда используете его, поэтому вы помещаете исполняемый код для этой функции в библиотеку, а компоновщик может извлекать и вставлять скомпилированный код в вашу программу, По этой причине статические библиотеки иногда называются "архивами".
Динамические библиотеки делают это еще на один шаг. Кажется расточительным иметь несколько копий библиотечных функций, занимающих место в каждой из программ. Почему они не могут использовать одну копию функции? Для этого нужны динамические библиотеки. Вместо этого создайте код библиотеки в своей программе, когда она скомпилирована, ее можно отобразить в вашу программу, поскольку она загружается в память для запуска. Несколько программ, работающих одновременно с использованием одних и тех же функций, могут совместно использовать одну копию, сохраняя память. Фактически, вы можете загружать динамические библиотеки только по мере необходимости, в зависимости от пути через ваш код. Нет смысла использовать подпрограммы принтера, если вы не выполняете печать. С другой стороны, это означает, что вам нужно иметь копию динамической библиотеки, установленной на каждом компьютере, на котором работает ваша программа. Это создает собственный набор проблем.
В качестве примера почти для каждой программы, написанной на языке C, понадобятся функции из библиотеки, называемой библиотекой времени выполнения C, хотя для нескольких программ требуются все функции. Время выполнения C входит в статическую и динамическую версии, поэтому вы можете определить, какую версию использует ваша программа в зависимости от конкретных потребностей.
Ответ 2
Другим аспектом является безопасность (обфускация). Когда часть кода извлекается из основного приложения и помещается в "разделенную" библиотеку динамических ссылок, легче атаковать, анализировать (обращать инженер) код, поскольку он был изолирован. Когда один и тот же фрагмент кода хранится в библиотеке LIB, он является частью скомпилированного (связанного) целевого приложения, и поэтому сложнее выделить (дифференцировать) эту часть кода из остальных целевых двоичных файлов.
Ответ 3
Одной из важных причин создания библиотеки DLL/LIB, а не просто компиляции кода в исполняемый файл, является повторное использование и перемещение. Среднее приложение Java или .NET(например), скорее всего, будет использовать несколько сторонних (или инфраструктурных) библиотек. Гораздо проще и быстрее просто скомпилировать сборку встроенной библиотеки, вместо того, чтобы компилировать весь сторонний код в ваше приложение. Компиляция вашего кода в библиотеки также поощряет хорошие методы проектирования, например. проектирование ваших классов, которые будут использоваться в различных типах приложений.
Ответ 4
DLL - это библиотека функций, которые совместно используются другими исполняемыми программами. Просто загляните в свой каталог windows/system32, и вы найдете десятки из них. Когда ваша программа создает DLL, она также обычно создает файл lib, чтобы программа приложения *.exe могла разрешать символы, объявленные в DLL.
A.lib - это библиотека функций, которые статически связаны с программой - они НЕ используются другими программами. Каждая программа, которая ссылается на файл *.lib, имеет весь код в этом файле. Если у вас есть две программы A.exe и B.exe, которые ссылаются на C.lib, тогда каждый A и B будут содержать код в C.lib.
Как вы создаете библиотеки DLL и libs, зависит от используемого вами компилятора. Каждый компилятор делает это по-другому.
Ответ 5
Еще одно отличие заключается в производительности.
Поскольку DLL загружается во время выполнения с помощью .exe(s),.exe и DLL работают с концепцией общей памяти и, следовательно, производительность низкая относительно статической привязки.
С другой стороны,.lib - это код, который статически ставится во время компиляции в каждый запрошенный процесс. Следовательно,.exe(s) будет иметь единую память, что увеличит производительность процесса.