Вопрос

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

Это было полезно?

Решение

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

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

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

Например, почти каждой программе, написанной на C, потребуются функции из библиотеки, называемой библиотекой времени выполнения C, хотя немногим программам потребуются все функции.Среда выполнения 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(s) и DLL работают с концепцией общей памяти, и, следовательно, производительность низкая по сравнению со статическим связыванием.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top