Чем отличается dll от lib
Во-первых, представить концепцию библиотеки динамической связи и библиотеку статической связи, оба являются способом совместного использования кода.
Статическая библиотека:На этапе ссылки Linker получит код из файла библиотеки, скопированного в исполняемый файл, называемый статической библиотекой. Он характеризуется исполняемым для полной копии библиотечного кода; недостатком заключается в том, что будут несколько копий резервирования для нескольких использований. То есть инструкции в статической библиотеке все непосредственно включены в окончательный сгенерированный EXE-файл. В новом построении недавно сгенерированной статической библиотеки в против, после того, как поколение компиляции успешно, только один файл .lib
Динамическая библиотека:Библиотека Dynamic Link - это библиотека, которая содержит код и данные, которые могут использоваться несколькими программами, а DLL не является исполняемым файлом. Динамические ссылки предоставляют метод, который позволяет вызывать функцию, которая не принадлежит к его исполняемому коду. Исполняемый код функции расположен в одной DLL, который содержит одну или несколько функций, которые были скомпилированы, ссылка и отдельно хранятся со своими процессами. В новом построении динамической библиотеки в против, после успешной компиляции генерируйте файл .lib и один файл .dll
3 ответа 3
Для начала, давайте разложим понятия по полочкам.
Формат .lib -- это принятый MSVC (возможно, и другими компиляторами) формат статической библиотеки, то есть, библиотеки, которая будет вкомпилирована компоновщиком в исполняемый модуль. У других компиляторов (в особенности -- на других системах!) может быть другой формат статических библиотек.
Формат .dll -- это принятый операционной системой Windows общесистемный формат динамических библиотек, то есть, библиотек, которые подключаются во время выполнения. Компиляторы, производящие код для Windows, обычно (но не всегда, конечно), производят динамические библиотеки в этом формате. (На других системах формат динамических библиотек, понятно, отличается.)
Рантайм-библиотека C++ -- это набор стандартных функций, которые обязаны быть доступны программе.
Статические/динамические библиотеки не оговорены в стандарте языка C++ (не путать со стандартной библиотекой!), его рантайм-библиотека может быть реализована как угодно на выбор авторов компилятора. Практически, однако, актуальные версии MSVC реализуют рантайм-библиотеку в обоих форматах статической и динамической библиотеки.
В MSVC можно производить и использовать любые библиотеки, статические (.lib) и динамические (.dll). Поскольку рантайм-библиотека есть в обоих вариантах, вы можете, по своему желанию, любой из них.
Таким образом, как .dll, так и .lib может содержать как стандартную библиотеку, так и что угодно иное.
(Вынес из комментария, не помещается). Когда вы подключаете .h, вы декларируете наличие каких-то функций. Чтобы компоновщик смог найти эти функции, они должны где-то быть.
Если эти функции есть в вашем коде в другом .cpp-файле, всё уже в порядке.
Если эти функции лежат в рантайм-библиотеке, нужно подключить её как статическую или динамическую библиотеку. (Но в проекте она уже подключена, стандартный проект MSVC подключает рантайм. Или не подключает, если вы выбрали такую настройку.)
Если вы подключаете что-то ещё, тут уж вам самим придётся подключать библиотеку, в которой лежат нужные функции, иначе компоновщик не сможет их найти.
То есть: подключать нужно, просто некоторые библиотеки (например, рантайм) подключены по умолчанию.
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?
3.1 генерировать динамическую библиотеку ссылок
Создайте проект C ++ DLL, выберите [Символ экспорта]
Выберите экспортный символ
Файл заголовка по умолчанию для создания проекта выглядит следующим образом:
Исходный файл по умолчанию выглядит следующим образом:
Нажмите [Compile] для компиляции файлов lib и dll.
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.
Я знаю очень мало о 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(ы) будет иметь одну память, тем самым увеличивая производительность процесса.
Не понимаю, в чём отличие библиотек(lib,dll,a,os) от "библиотек"(.h/cpp)?
Хочу научиться создавать библы(lib, dll), а при запросе в гугл выдает только что то про .h(что я уже и так давно знаю). Я просто всегда думал, что .h - это обычные файлы заголовки, НЕ библиотеки. А в гугле эти заголовки называют библиотеками.
В чём отличие lib, dll, h,(кроме того что либ - статическая и находится в бинарии, exe; а длл - динамическая и могут коннектится сразу несколько источников одновременно) и как их создать(книга/ресурс).
Как в VS 2015 устранить ошибку LNK 1104 cannot open file 'fltkd.lib wsock32.lib comct132.lib fltkjpegd.lib'?
как устранить ошибку LNK 1104 в visual studio community 2015? пункта C/C++ в properties нету .
Linker error msvcprtd.lib(msvcp100d.dll) error lnk2005 already defined libcpmtd.lib
Господа, забрал из VSS солюшен (из 5 проектов) для VS2010 и стал его собирать. Увлекательный.
[C++ Error] Lib.cpp(18): E2040 Declaration terminated incorrectly
Доброго времени суток. Пытаюсь компильнуть прогу. Lib.cpp(18): E2040 Declaration terminated.
- динамические *.dll (windows), *.so(linux)
- статические *.lib (windows), *.a (linux)
h и сpp это исходники (библиотеки?) .
Т.е. библиотеки могут распространятся чисто исходниками, а могут распространятся бинарными файлами типа dll (как правило с *.h файлами и *.lib импорта к ней)
Все остальное гуглится.
Добавлено через 4 минуты
а длл - динамическая и могут коннектится сразу несколько источников одновременно) и как их создать(книга/ресурс).
Решение
Библиотекой может называться любой код для выполнения определенной задачи. Это может быть набор *.c + *.h файлов, которые подключаются к проекту. Может быть тот же набор, но скомпилированный, получается статическая библиотека (*.a / *.lib), либо динамическая (*.so / *.dll) плюс заголовочный файл к ней (*.h). Причем скомпилированная часть (все кроме *.h) может поставляться в комплекте с компилятором. Иногда библиотека действительно состоит из единственного *.h файла, который содержит в себе все необходимые шаблоны, макросы, функции и т.д.
Разницу между статическими и динамическими библиотеками вы понимаете правильно: статическая намертво встраивается в исполняемый файл, а динамическая подключается во время работы. Еще дополню, что динамическая может быть загружена непосредственно программистом в нужное ему время, это позволяет проверять наличие в библиотеке нужных функций и менять их назначение без перекомпиляции "ядра".
*.h редко бывает библиотекой сам по себе, но всегда входит составной частью.
Если реализация библиотеки находится в стандартных модулях компилятора, подключать ее отдельно не надо, достаточно дать понять, что мы хотим ей пользоваться. В таком случае библиотеку называют по заголовочному файлу. Например, библиотека stdio.h, или wchar.h. Иногда даже стандартную библиотеку необходимо подключать явно (math.h например, или pthreads.h), но их все равно называют по заголовочному файлу.
В чём отличие lib, dll, h,(кроме того что либ - статическая и находится в бинарии, exe; а длл - динамическая и могут коннектится сразу несколько источников одновременно)
Для пользователя всю разницу вы перечислили.
По внутреннему устройству все чуть сложнее, поэтому начну издалека. Когда вы хотите скомпилировать проект, состоящий из нескольких файлов исходного кода (*.c, *.cpp, но не *.h), вы компилируете каждый файл отдельно в объектный файл (*.o). Это такие полуфабрикаты, уже в бинарном виде, но еще с зависимостями. Поэтому последним этапом идет линковка. При этом *.o файлы копируются в выходной бинарный файл, зависимости разрешаются и адреса исправляются.
Так вот, статическая библиотека это всего лишь комплект полуфабрикатов (*.o) сжатый специальным архиватором.
А динамическая библиотека - полноценный исполняемый файл, то есть продукт линковки. Правда, тоже в немного необычном формате, так что запустить ее как обычный исполняемый файл не выйдет.
3.2 Использование динамической библиотеки ссылок
Существует два способа звонить библиотеки динамической связи: неявные вызовы, отображаемые вызовы
Здравствуйте. Файлы (для подключения функций из библиотек и пакетов. В с++) с расширениями .lib и .dll уже заведомо не входят в Стандартную библиотеку C++?
2. В чем разница между файлом LIB статической библиотеки и динамической библиотекой?
Lib в статической библиотеке:Lib содержит сам код функциональности (т. Е. Индекс, включая функции, включая реализацию), и напрямую добавляют код непосредственно при компиляции.
Lib в динамической библиотеке:LIB содержит информацию (индекс) местоположения функции в DLL-файле и файле функции, и код реализации функций загружен DLL, загруженной в пространстве процесса.
Примечания:Lib используется в компиляции, а DLL используется при работе. Если вы хотите завершить компиляцию исходного кода, вам нужно только lib; если вы хотите запустить динамическую ссылку, вам нужно только DLL.
3. Создайте и используйте динамические библиотеки ссылок
Читайте также: