Чем отличается dll от lib

Обновлено: 07.07.2024

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

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

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

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

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

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

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

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

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

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

Как DLL загружается во время выполнения .exe (s), the .exe (Ы) и DLL работают с концепцией общей памяти и, следовательно, производительность низкая относительно статической связи.

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

I know very little about DLL's and LIB's other than that they contain vital code required for a program to run properly - libraries. But why do compilers generate them at all? Wouldn't it be easier to just include all the code in a single executable? And what's the difference between DLL's and LIB's?

61.7k 45 45 gold badges 147 147 silver badges 152 152 bronze badges 2,693 5 5 gold badges 20 20 silver badges 11 11 bronze badges

5 Answers 5

There are static libraries (LIB) and dynamic libraries (DLL) - but note that .LIB files can be either static libraries (containing object files) or import libraries (containing symbols to allow the linker to link to a DLL).

Libraries are used because you may have code that you want to use in many programs. For example if you write a function that counts the number of characters in a string, that function will be useful in lots of programs. Once you get that function working correctly you don't want to have to recompile the code every time you use it, so you put the executable code for that function in a library, and the linker can extract and insert the compiled code into your program. Static libraries are sometimes called 'archives' for this reason.

Dynamic libraries take this one step further. It seems wasteful to have multiple copies of the library functions taking up space in each of the programs. Why can't they all share one copy of the function? This is what dynamic libraries are for. Rather than building the library code into your program when it is compiled, it can be run by mapping it into your program as it is loaded into memory. Multiple programs running at the same time that use the same functions can all share one copy, saving memory. In fact, you can load dynamic libraries only as needed, depending on the path through your code. No point in having the printer routines taking up memory if you aren't doing any printing. On the other hand, this means you have to have a copy of the dynamic library installed on every machine your program runs on. This creates its own set of problems.

As an example, almost every program written in 'C' will need functions from a library called the 'C runtime library, though few programs will need all of the functions. The C runtime comes in both static and dynamic versions, so you can determine which version your program uses depending on particular needs.

Здравствуйте. Файлы (для подключения функций из библиотек и пакетов. В с++) с расширениями .lib и .dll уже заведомо не входят в Стандартную библиотеку C++?

35 1 1 золотой знак 1 1 серебряный знак 4 4 бронзовых знака

Для начала, давайте разложим понятия по полочкам.

Формат .lib -- это принятый MSVC (возможно, и другими компиляторами) формат статической библиотеки, то есть, библиотеки, которая будет вкомпилирована компоновщиком в исполняемый модуль. У других компиляторов (в особенности -- на других системах!) может быть другой формат статических библиотек.

Формат .dll -- это принятый операционной системой Windows общесистемный формат динамических библиотек, то есть, библиотек, которые подключаются во время выполнения. Компиляторы, производящие код для Windows, обычно (но не всегда, конечно), производят динамические библиотеки в этом формате. (На других системах формат динамических библиотек, понятно, отличается.)

Рантайм-библиотека C++ -- это набор стандартных функций, которые обязаны быть доступны программе.

Статические/динамические библиотеки не оговорены в стандарте языка C++ (не путать со стандартной библиотекой!), его рантайм-библиотека может быть реализована как угодно на выбор авторов компилятора. Практически, однако, актуальные версии MSVC реализуют рантайм-библиотеку в обоих форматах статической и динамической библиотеки.

В MSVC можно производить и использовать любые библиотеки, статические (.lib) и динамические (.dll). Поскольку рантайм-библиотека есть в обоих вариантах, вы можете, по своему желанию, любой из них.

Таким образом, как .dll, так и .lib может содержать как стандартную библиотеку, так и что угодно иное.

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

Если эти функции есть в вашем коде в другом .cpp-файле, всё уже в порядке.

Если эти функции лежат в рантайм-библиотеке, нужно подключить её как статическую или динамическую библиотеку. (Но в проекте она уже подключена, стандартный проект MSVC подключает рантайм. Или не подключает, если вы выбрали такую настройку.)

Если вы подключаете что-то ещё, тут уж вам самим придётся подключать библиотеку, в которой лежат нужные функции, иначе компоновщик не сможет их найти.

То есть: подключать нужно, просто некоторые библиотеки (например, рантайм) подключены по умолчанию.

Во-первых, представить концепцию библиотеки динамической связи и библиотеку статической связи, оба являются способом совместного использования кода.

Статическая библиотека:На этапе ссылки Linker получит код из файла библиотеки, скопированного в исполняемый файл, называемый статической библиотекой. Он характеризуется исполняемым для полной копии библиотечного кода; недостатком заключается в том, что будут несколько копий резервирования для нескольких использований. То есть инструкции в статической библиотеке все непосредственно включены в окончательный сгенерированный EXE-файл. В новом построении недавно сгенерированной статической библиотеки в против, после того, как поколение компиляции успешно, только один файл .lib

Динамическая библиотека:Библиотека Dynamic Link - это библиотека, которая содержит код и данные, которые могут использоваться несколькими программами, а DLL не является исполняемым файлом. Динамические ссылки предоставляют метод, который позволяет вызывать функцию, которая не принадлежит к его исполняемому коду. Исполняемый код функции расположен в одной DLL, который содержит одну или несколько функций, которые были скомпилированы, ссылка и отдельно хранятся со своими процессами. В новом построении динамической библиотеки в против, после успешной компиляции генерируйте файл .lib и один файл .dll

2. В чем разница между файлом LIB статической библиотеки и динамической библиотекой?

Lib в статической библиотеке:Lib содержит сам код функциональности (т. Е. Индекс, включая функции, включая реализацию), и напрямую добавляют код непосредственно при компиляции.

Lib в динамической библиотеке:LIB содержит информацию (индекс) местоположения функции в DLL-файле и файле функции, и код реализации функций загружен DLL, загруженной в пространстве процесса.

Примечания:Lib используется в компиляции, а DLL используется при работе. Если вы хотите завершить компиляцию исходного кода, вам нужно только lib; если вы хотите запустить динамическую ссылку, вам нужно только DLL.

3. Создайте и используйте динамические библиотеки ссылок

3.1 генерировать динамическую библиотеку ссылок

Создайте проект C ++ DLL, выберите [Символ экспорта]


Выберите экспортный символ

Файл заголовка по умолчанию для создания проекта выглядит следующим образом:

Исходный файл по умолчанию выглядит следующим образом:

Нажмите [Compile] для компиляции файлов lib и dll.

3.2 Использование динамической библиотеки ссылок

Существует два способа звонить библиотеки динамической связи: неявные вызовы, отображаемые вызовы

Анализ DLL библиотеки динамической компоновки Windows

DLL: Библиотека динамической компоновки, а именноБиблиотека динамической компоновкиЭтот вид библиотеки содержит код и данные, которые могут использоваться несколькими программами одновременно.

Это способ для Microsoft реализовать концепцию библиотеки общих функций в операционной системе Windows. Вот некоторые из файлов, реализованных в Windows как библиотеки DLL:

  • Файлы элементов управления ActiveX (.ocx): например, элемент управления календарем в Windows.
  • Файл панели управления (.cpl). Каждый элемент панели управления представляет собой выделенную DLL.
  • Файлы драйвера устройства (.drv): например, драйверы принтера, управляющие печатью на принтере.

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



преимущество:

(1) Экономия памяти и повторное использование кода: Когда несколько программ используют одну и ту же библиотеку функций, DLL может уменьшить количество повторений загрузки кода на диск и в физическую память, а также помочь повторно использовать код.

(2) Модуляризация: DLL способствует развитию модульных программ. Модульность позволяет изменять только код и данные в DLL, совместно используемой несколькими приложениями, без изменения самого приложения. Базовая форма этого языка модуля позволяет крупным приложениям, таким как Microsoft Office, Microsoft Visual Studio и даже самой Windows, использовать более компактные исправления и пакеты обновления.

Недостаток:

DLL Hell :которыйDLL ад, Относится к конфликту версий, когда несколько приложений используют одну и ту же общую библиотеку DLL.

Причина в восьми словах:Делитесь успехами и неудачами. Потому что DLL Hell происходит именно потому, что библиотека динамической компоновки может делиться функциями и ресурсами с другими программами.

Есть две основные ситуации:

Представьте себе такой сценарий: программа A будет использовать версию 1.0 библиотеки динамической компоновки X, а затем, когда программа A будет установлена ​​в системе, одновременно будет установлена ​​версия 1.0 библиотеки динамической компоновки X. Предполагая, что другая программа B также будет использовать библиотеку динамической компоновки X, тогда программу B можно напрямую скопировать на жесткий диск для нормальной работы, потому что библиотека динамической компоновки уже существует в системе. Однако однажды другая программа C также будет использовать библиотеку динамической компоновки X, но из-за поздней разработки программы C ей потребуется более новая версия - версия 2.0 библиотеки динамической компоновки X. Когда программа C установлена ​​в системе, в системе также должна быть установлена ​​версия 2.0 библиотеки динамической компоновки X. В это время версия 1.0 библиотеки динамической компоновки в системе будет заменена (заменена) версией 2.0.

Ситуация 1: Новая версия библиотеки динамической компоновки несовместима со старой версией. Например, A и B нуждаются в функции, предоставляемой X. После обновления до 2.0 новая версия X отменила эту функцию (это трудно представить, но иногда бывает так . ). В настоящее время, хотя C может работать нормально, ни A, ни B не могут работать.

Ситуация 2: Новая версия библиотеки динамической компоновки совместима со старой версией, но есть ошибка.

Взгляните на следующий пример (чтобы проиллюстрировать проблему):

  1. // X1.0 version
  2. void func( int count)
  3. if (count < 0)
  4. count = 0;
  5. ….
  6. >
  7. // X2.0 version
  8. void func( int count)
  9. // Обработка отрицательных чисел удалена!
  10. >

Если счетчик станет отрицательным, у программы A возникнут проблемы с новой версией.

Решение :Side-by-side Assembly, Является ли технология, используемая системами Windows XP и выше для разрешения конфликтов версий библиотеки динамической компоновки. Ключевым моментом является то, что при компиляции программы VS генерирует файл манифеста, который указывает номер версии библиотеки динамической компоновки, используемой текущим приложением; он должен быть выпущен одновременно с выпуском программы. Файл манифеста используется DLL на клиентском компьютере Loader для загрузки соответствующей версии DLL в соответствии с манифестом. Если манифест не выпущен, клиент загружает DLL в соответствии с версией по умолчанию. Следующая картина представляет собой типичную сцену:



На первый взгляд: lib - это библиотека статической компоновки; DLL - это библиотека динамической компоновки, одна предоставляется во время компиляции; другая предоставляется во время выполнения, завершена.

Статическая библиотека: Он помещает декларацию экспорта (описанную ниже) и реализацию в библиотеку, а весь код встраивается в основную программу после компиляции.

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

В среде разработки VC ++ 6.0 откройте опцию File \ New \ Project, вы можете выбрать Win32 Dynamic-Link Library или MFC AppWizard [dll] для создания различных типов не-MFC DLL, обычной DLL, DLL расширения и т. Д. Различными способами. Библиотека динамической компоновки. Затем выберите Win32 Dynamic-Link Library, чтобы создать DLL (реализоватьдополнениеЭксплуатации):

Читайте также: