Я очень мало знаю о библиотеках DLL и LIB, кроме того, что они содержат жизненно важный код, необходимый для правильной работы программы - библиотеки. Но почему компиляторы вообще их генерируют? Не было бы проще просто включить весь код в один исполняемый файл? А в чем разница между DLL и LIB?
Файлы DLL и LIB - что и почему?
Ответы (5)
Существуют статические библиотеки (LIB) и динамические библиотеки (DLL), но обратите внимание, что файлы .LIB могут быть либо статическими библиотеками (содержащими объектные файлы), либо библиотеками импорта (содержащими символы, позволяющие компоновщику связываться с DLL).
Библиотеки используются, потому что у вас может быть код, который вы хотите использовать во многих программах. Например, если вы пишете функцию, которая подсчитывает количество символов в строке, эта функция будет полезна во многих программах. Как только вы добьетесь правильной работы этой функции, вам не захочется перекомпилировать код каждый раз, когда вы ее используете, поэтому вы помещаете исполняемый код для этой функции в библиотеку, а компоновщик может извлечь и вставить скомпилированный код в вашу программу. . По этой причине статические библиотеки иногда называют «архивами».
Динамические библиотеки делают еще один шаг вперед. Кажется расточительным иметь несколько копий библиотечных функций, занимающих место в каждой из программ. Почему они не могут использовать одну копию функции? Для этого нужны динамические библиотеки. Вместо того, чтобы встраивать код библиотеки в вашу программу, когда она скомпилирована, ее можно запустить, отображая ее в вашу программу по мере ее загрузки в память. Несколько программ, работающих одновременно и использующих одни и те же функции, могут использовать одну копию, что экономит память. Фактически, вы можете загружать динамические библиотеки только по мере необходимости, в зависимости от пути прохождения вашего кода. Нет смысла в том, чтобы процедуры принтера занимали память, если вы не печатаете. С другой стороны, это означает, что у вас должна быть установлена копия динамической библиотеки на каждом компьютере, на котором работает ваша программа. Это создает свой собственный набор проблем.
Например, почти каждой программе, написанной на 'C', потребуются функции из библиотеки, называемой 'C runtime library, хотя немногим программам потребуются все функции. Среда выполнения C поставляется как в статической, так и в динамической версиях, поэтому вы можете определить, какую версию использует ваша программа, в зависимости от конкретных потребностей.
.LIB
файлы могут быть либо статическими библиотеками (содержащими объектные файлы), либо библиотеками импорта (содержащими символы, позволяющие компоновщику связываться с DLL). Мне интересно, почему это так.
- person Lumi; 21.06.2011
.lib
файл, предоставленный создателем DLL вместе с соответствующими заголовками; этот .lib
- просто дескриптор целевой DLL, он содержит адреса, точку входа и т. д., но не код. Это .lib
необходимо передать компоновщику. Второй - явное связывание, когда мы используем DLL, вручную загружая ее с помощью функции LoadLibrary
. В этом типе нам не нужен этот .lib
файл, но мы должны приложить немного усилий, чтобы найти экспорт DLL, их адреса и вызвать эти функции через указатели.
- person itachi; 09.11.2019
Другой аспект - безопасность (обфускация). Как только фрагмент кода извлекается из основного приложения и помещается в «отдельную» библиотеку динамической компоновки, становится проще атаковать, анализировать (переконструировать) код, поскольку он изолирован. Когда один и тот же фрагмент кода хранится в библиотеке LIB, он является частью скомпилированного (связанного) целевого приложения, и поэтому сложнее изолировать (отличить) этот фрагмент кода от остальных целевых двоичных файлов.
Одной из важных причин для создания DLL / LIB, а не просто компиляции кода в исполняемый файл, является повторное использование и перемещение. Среднее приложение Java или .NET (например), скорее всего, будет использовать несколько сторонних библиотек (или фреймворков). Гораздо проще и быстрее просто скомпилировать предварительно созданную библиотеку, вместо того, чтобы компилировать весь сторонний код в свое приложение. Компиляция вашего кода в библиотеки также способствует хорошему дизайну, например проектирование ваших классов для использования в различных типах приложений.
DLL - это библиотека функций, которые используются другими исполняемыми программами. Просто загляните в свой каталог windows / system32, и вы найдете их десятки. Когда ваша программа создает DLL, она также обычно создает файл lib, чтобы программа application * .exe могла разрешать символы, объявленные в DLL.
.Lib - это библиотека функций, которые статически связаны с программой - они НЕ используются другими программами. Каждая программа, которая связывается с файлом * .lib, имеет весь код в этом файле. Если у вас есть две программы A.exe и B.exe, которые связаны с C.lib, то каждая из A и B будет содержать код в C.lib.
То, как вы создаете библиотеки DLL и библиотеки, зависит от используемого компилятора. Каждый компилятор делает это по-своему.
Еще одно отличие заключается в производительности.
Поскольку DLL загружается во время выполнения с помощью .exe (s), .exe (s) и DLL работают с концепцией общей памяти, и, следовательно, производительность низкая по сравнению со статическим связыванием.
С другой стороны, .lib - это код, который статически связан во время компиляции с каждым запрашиваемым процессом. Следовательно, EXE-файлы будут иметь единственную память, что повысит производительность процесса.