DLL и LIB файлы - что и почему? - PullRequest
185 голосов
/ 27 мая 2009

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

Ответы [ 5 ]

251 голосов
/ 27 мая 2009

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

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

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

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

31 голосов
/ 03 июля 2012

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

13 голосов
/ 27 мая 2009

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

8 голосов
/ 19 января 2016

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

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

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

3 голосов
/ 08 сентября 2017

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

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

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

...