C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: статические и динамические "либы"  (Прочитано 5943 раз)
soican
Участник


Сказали спасибо: +1/-1
Offline

Сообщений: 42


статические и динамические "либы"
« : 02 Июль 2013, 21:05:38 »

вот часто просто вгоняет в ступор некоторые белые пятна в моём познании...когда собирал boost там встретил это определение, но что это означает фактически, по-простому я понять не могу. Для меня библиотека - это нечто такое, что после её подключения даёт возможность использовать её функции. Что здесь может быть динамического и статического?
Записан
Tantos
А ты воспользовался поиском перед тем, как спросить?!
Давний друг


Сказали спасибо: +350/-28
Offline

Сообщений: 2181


Re: статические и динамические "либы"
« Ответ #1 : 03 Июль 2013, 06:57:28 »

Линковка (подключение) библиотеки бывает статической и динамической.
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: статические и динамические "либы"
« Ответ #2 : 03 Июль 2013, 09:25:35 »

Статическая линковка (по-другому, "компоновка", "подключение") библиотеки (например, DLL) происходит при сборке проекта: сначала отрабатывает компилятор, который компилирует программу, а затем компоновщик (он же "линкер"), который привязывает к ней все указанные библиотеки, объектные файлы, предкомпилированные заголовки и т.д. Т.е. при статическом подключении библиотеки работоспособность всего приложения (программы) зависит от работоспособности подключенных библиотек; если какая-та статическая библиотека не найдена, приложения просто не будет выполняться.
При динамическом подключении линковщик не трогает соответсвующую библиотеку - он ее вообще "не видит". Библиотека же подключается в режиме реального времени - когда приложение уже выполняется. Например, в винде подключение DLL происходит вызовом апишной функции LoadLibrary (которая возвращает дескриптор загруженной библиотеки), а выгрузка - при помощи FreeLibrary. Такое приложение не зависит от подключаемых библиотек: если библа не найдена, LoadLibrary просто вернет нулевой дескриптор и на работоспособности приложении это никак не отразится.

Надеюсь, понятно объяснил )
Записан
soican
Участник


Сказали спасибо: +1/-1
Offline

Сообщений: 42


Re: статические и динамические "либы"
« Ответ #3 : 03 Июль 2013, 16:48:05 »

Как я понял, если библиотеку собираются использовать статически, она должна быть и собрана соответствующим образом, а если динамически - то собрана по-другому.
В первом случае будем писать #include к примеру, а во втором будем обращаться с помощью LoadLibrary
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: статические и динамические "либы"
« Ответ #4 : 04 Июль 2013, 07:37:24 »

Цитата: soican от 03 Июль 2013, 16:48:05
Как я понял, если библиотеку собираются использовать статически, она должна быть и собрана соответствующим образом, а если динамически - то собрана по-другому.
В первом случае будем писать #include к примеру, а во втором будем обращаться с помощью LoadLibrary

Не так. Библиотека и в том и в другом случае - одна и та же, например, Mylib.dll. Просто подключается она по-разному:
* при статическом подключении для этой библы необходимо также иметь (или создать) LIB файл (Mylib.lib), который либо включается в проект C++Builder, либо (что правильнее) прописывается в коде программы как опция линковщика (обычно в CPP главного модуля, после секций include и до объявлений/определений):
Код
#pragma link "Mylib.lib"
 
Сама dll-ка при этом (как и при динамическом подключении) должна находиться там, где приложение ее сможет увидеть - либо в директории исполняемого файла (exe), либо в системной директории (system32).
* при динамическом подключении никаких LIB файлов не требуется. Однако динамическая загрузка требует больше усилий со стороны программиста: нужно еще вручную объявить указатели на функции, загружаемые из dll, загрузить библу (LoadLibrary) и инициализировать указатели на функции конкретными функциями при помощи вызовов GetProcAddress, а также самостоятельно проверять все возможные ошибки и освободить память (FreeLibrary).

И еще раз - статическое подключение выполняется при компиляции приложения и линкует библиотеку прямо в код приложения. Динамическое подключение / отключение может выполняться в любое время, пока приложение работает, т.к. код приложения не содержит сведений о подключаемых таким образом библиотеках.
Записан
Kray74
Посты на падонкаффском принципиально не читаю.
Участник


Сказали спасибо: +81/-1
Offline

Сообщений: 366


Re: статические и динамические "либы"
« Ответ #5 : 04 Июль 2013, 09:19:30 »

S0mbre, ты путаешь статические либы со статическим подключением к dll.
Статическая библиотека - это *.lib файл, которому не нужны никакие *.dll. Когда статическая либа линкуется к приложению, ее содержимое (не всё, а только реально используемое) "вставляется" в екзешник. Конечному приложению для запуска либа не требуется. Т.е. это что-то вроде предкомпилированных заголовков, только в более общем виде.
Записан
soican
Участник


Сказали спасибо: +1/-1
Offline

Сообщений: 42


Re: статические и динамические "либы"
« Ответ #6 : 05 Июль 2013, 00:28:54 »

у мне про то и про это полезно было узнать
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: статические и динамические "либы"
« Ответ #7 : 07 Июль 2013, 21:06:45 »

Цитата: Kray74 от 04 Июль 2013, 09:19:30
S0mbre, ты путаешь статические либы со статическим подключением к dll.
Статическая библиотека - это *.lib файл, которому не нужны никакие *.dll. Когда статическая либа линкуется к приложению, ее содержимое (не всё, а только реально используемое) "вставляется" в екзешник. Конечному приложению для запуска либа не требуется. Т.е. это что-то вроде предкомпилированных заголовков, только в более общем виде.

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


Сказали спасибо: +81/-1
Offline

Сообщений: 366


Re: статические и динамические "либы"
« Ответ #8 : 08 Июль 2013, 11:09:57 »

OK, изначально речь шла про boost. Подключать boost динамически (LoadLibrary(), GetProcAddress()) в здравом уме никто не будет, так. Остается два варианта:
1. Статическое подключение к dll с помощью библиотеки импорта lib (то о чем ты говоришь);
2. Компоновка со статической библиотекой lib, без использования dll (о чем я говорю).
Использование буста с динамическими библиотеками подразумевает первый вариант (b2.exe link=shared), со статическими - второй (b2.exe link=static).

Проблема в том, что статические библиотеки и библиотеки импорта имеют одно и то же расширение, из-за этого их и путают. Кстати, в MinGW эту проблему решили: статические библиотеки имеют расширение *.a, библиотеки импорта - *.dll.a (не уверен, что это правило применяется к библиотекам самого MinGW (libgcc, stdlibc++ и т.д.)).
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: статические и динамические "либы"
« Ответ #9 : 08 Июль 2013, 12:51:13 »

Цитата: Kray74 от 08 Июль 2013, 11:09:57
OK, изначально речь шла про boost.
...

boost - это вообще отдельная "песня". Там >75% "библиотек" собственно библиотеками не являются - это просто наборы заголовков и реализаций классов (шаблонных и обыкновенных), как STL. Лишь некоторые boost-ы являются библиотками (например, boost::threads, boost::regex и т.д.). И тогда там есть DLL-ки, как и файлы экспорта (LIB).

Записан
Kray74
Посты на падонкаффском принципиально не читаю.
Участник


Сказали спасибо: +81/-1
Offline

Сообщений: 366


Re: статические и динамические "либы"
« Ответ #10 : 08 Июль 2013, 13:26:47 »

Если boost собирать с параметром link=static (без всяких complete и minimal), то будут только lib.
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: статические и динамические "либы"
« Ответ #11 : 08 Июль 2013, 13:33:36 »

Цитата: Kray74 от 08 Июль 2013, 13:26:47
Если boost собирать с параметром link=static (без всяких complete и minimal), то будут только lib.

Хм, странно. Всегда считал, что LIB (под виндой) - библиотека экспорта; об этом говорит даже малый размер файла LIB по сравнению с соответствующей DLL.
Записан
Kray74
Посты на падонкаффском принципиально не читаю.
Участник


Сказали спасибо: +81/-1
Offline

Сообщений: 366


Re: статические и динамические "либы"
« Ответ #12 : 08 Июль 2013, 14:43:24 »

Цитата: S0mbre от 08 Июль 2013, 13:33:36
Хм, странно. Всегда считал, что LIB (под виндой) - библиотека экспорта;
Еще раз повторяю
Цитировать
Проблема в том, что статические библиотеки и библиотеки импорта имеют одно и то же расширение, из-за этого их и путают.
LIB может быть как библиотекой импорта, так и статической библиотекой. Конкретно в доках boost, термин static относится к статической библиотеке.
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


« Ответ #13 : 09 Июль 2013, 06:53:19 »

Цитата: Kray74 от 08 Июль 2013, 14:43:24
Цитата: S0mbre от 08 Июль 2013, 13:33:36
Хм, странно. Всегда считал, что LIB (под виндой) - библиотека экспорта;
Еще раз повторяю
Цитировать
Проблема в том, что статические библиотеки и библиотеки импорта имеют одно и то же расширение, из-за этого их и путают.
LIB может быть как библиотекой импорта, так и статической библиотекой. Конкретно в доках boost, термин static относится к статической библиотеке.

OK, может быть Тогда это на совести разработчиков boost 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.103 секунд. Запросов: 19.