Форум программистов, компьютерный форум CyberForum.ru

В чём разница между динамической и статической линковкой библиотеки? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 88, средняя оценка - 4.94
Freq1
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 48
04.05.2013, 12:48     В чём разница между динамической и статической линковкой библиотеки? #1
В чём разница между динамической и статической линковкой библиотеки?
Если можно с примером.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.05.2013, 12:48     В чём разница между динамической и статической линковкой библиотеки?
Посмотрите здесь:

C++ [C++]Различные варианты инициализации указателя - в чём точная разница между ними?
В чём разница между процедурами и функциями ? C++
В чём разница между заголовками <c***> и <***.h>? C++
Не объясните в чём разница между случаями C++
Есть ли разница между подключением статической библиотеки и подключением одного только файла C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gazlan
2857 / 1805 / 271
Регистрация: 27.08.2010
Сообщений: 4,887
Записей в блоге: 1
04.05.2013, 14:48     В чём разница между динамической и статической линковкой библиотеки? #2
Динамические библиотеки - это как дрель со сменной насадкой: перед работой вставляется нужная.

То есть часть кода, которая может быть заменена и/или разделена с другими аппликациями, выносится в динамические библиотеки. То, что не предполагается менять и разделять с другими, линкуется статически.

Все остальное - детали реализации.
Freq1
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 48
04.05.2013, 15:05  [ТС]     В чём разница между динамической и статической линковкой библиотеки? #3
gazlan, а можешь пример динамической линковки?
gazlan
2857 / 1805 / 271
Регистрация: 27.08.2010
Сообщений: 4,887
Записей в блоге: 1
04.05.2013, 15:32     В чём разница между динамической и статической линковкой библиотеки? #4
Цитата Сообщение от Freq1 Посмотреть сообщение
пример динамической линковки
Почти все, что можно найти в "WINDOWS\system32".
"kernel32.dll", например, динамически линкуется с почти каждым Windows-приложением.

Аналогично и для других OS.

Динамическое связывание используется и при нехватке оперативной памяти (через менеджмент оверлеев), и при использовании сторонних компонент (технологии COM итп), очень часто в динамические библиотеки выносится Runtime компиляторов.

Фактически, 9/10 из того, что находится в адресном пространстве процесса, загружается туда динамически.
Freq1
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 48
04.05.2013, 15:43  [ТС]     В чём разница между динамической и статической линковкой библиотеки? #5
gazlan, я имею ввиду пример реализации?

Добавлено через 5 минут
Если можно на Code Blocks'e.
Убежденный
Системный программист
 Аватар для Убежденный
14183 / 6198 / 984
Регистрация: 02.05.2013
Сообщений: 10,324
Завершенные тесты: 1
04.05.2013, 15:44     В чём разница между динамической и статической линковкой библиотеки? #6
При динамической компоновке код библиотеки помещается во внешний модуль (dll), связывание с
которым происходит на этапе выполнения. Отсюда и название - динамическая.
При статической компоновке код библиотеки собирается вместе с клиентским кодом, как одно целое.

Пример: среда выполнения Visual C++ (runtime) может компоноваться как динамически, так и статически.
Если программа компонуется с runtime динамически, то при вызове стандартных функций, таких как printf,
будет использована их реализация, помещенная в соответствующие dll. Для Visual C++ 2008, например,
это msvcr90.dll и msvcp90.dll. Если программа использует runtime статически, тогда код printf и других
используемых ей функций будет собран в том же exe.

Оба подхода имеют как достоинства, так и недостатки.
В первом случае (динамика) экономится пространство на диске, в памяти, устраняется лишнее
дублирование, а обновление библиотеки можно сделать простой заменой dll. Во втором случае
(статика) уменьшается количество зависимостей от dll, программа становится более легко переносимой, в
случае небольших программ (когда счет идет на десятки или сотни килобайт) также экономится место,
так как нет необходимости таскать за собой dll, большая часть функций которых не используется.
Иногда в случае статической компоновки может быть сгенерирован более эффективный код.
Freq1
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 48
04.05.2013, 16:11  [ТС]     В чём разница между динамической и статической линковкой библиотеки? #7
Убежденный, а если я неявно подключаю динамическую библиотеку, то это статическая или же динамическая линковка?
Убежденный
Системный программист
 Аватар для Убежденный
14183 / 6198 / 984
Регистрация: 02.05.2013
Сообщений: 10,324
Завершенные тесты: 1
04.05.2013, 18:35     В чём разница между динамической и статической линковкой библиотеки? #8
Что значит "неявно" ? dll - это всегда динамическая компоновка.
Но здесь есть еще один термин - связывание, оно может быть ранним или поздним.
При раннем связывании вы создаете жесткую ссылку на dll на этапе компоновки, и
эта dll загружается в адресное пространство процесса во время его запуска.
А при позднем связывании программа вызывает LoadLibrary(Ex)/GetProcAddress,
загружая dll уже в процессе выполнения.

Например, я могу написать так:
C++
1
2
3
4
5
6
7
#include <Windows.h>
 
int main()
{
    MessageBoxW(NULL, L"Hello, World !", L"Message", MB_OK);
    return 0;
}
Это будет раннее связывание, так как ссылка на MessageBox разрешается
компоновщиком на этапе сборки программы.
А вот пример позднего связывания:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <Windows.h>
 
int main()
{
    typedef int (_stdcall *PFN_MSGBOX)(HWND, wchar_t const *, wchar_t const *, UINT);
 
    HANDLE const hUser32Dll = LoadLibraryW(L"user32.dll");
 
    if (NULL == hUser32Dll)
    {
        return EXIT_FAILURE;
    }
 
    PFN_MSGBOX pfnMsgBox = (PFN_MSGBOX)GetProcAddress(hUser32Dll, "MessageBoxW");
 
    if (NULL == pfnMsgBox)
    {
        FreeLibrary(hUser32Dll);
        return EXIT_FAILURE;
    }
 
    pfnMsgBox(NULL, L"Hello, World !", L"Message", MB_OK);
 
    FreeLibrary(hUser32Dll);
    return EXIT_SUCCESS;
}
Freq1
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 48
04.05.2013, 18:43  [ТС]     В чём разница между динамической и статической линковкой библиотеки? #9
Убежденный, насколько мне известно именно это и називаеться явное и неявное подключение.
Оба эти варианта линкуются динамически?
Dmitriy_M
1294 / 1175 / 104
Регистрация: 20.03.2009
Сообщений: 4,208
Записей в блоге: 11
04.05.2013, 18:49     В чём разница между динамической и статической линковкой библиотеки? #10
Цитата Сообщение от Убежденный Посмотреть сообщение
В первом случае (динамика) экономится пространство на диске
Не всегда экономится место.
Цитата Сообщение от Убежденный Посмотреть сообщение
а обновление библиотеки можно сделать простой заменой dll.
И хорошо бы избежать DLL hell
Убежденный
Системный программист
 Аватар для Убежденный
14183 / 6198 / 984
Регистрация: 02.05.2013
Сообщений: 10,324
Завершенные тесты: 1
04.05.2013, 18:59     В чём разница между динамической и статической линковкой библиотеки? #11
Цитата Сообщение от Freq1 Посмотреть сообщение
Убежденный, насколько мне известно именно это и називаеться явное и неявное подключение.
Это более распостранено под названием "раннее и позднее связывание".
В терминах MSDN - "load-time dynamic linking" и "run-time dynamic linking".

Цитата Сообщение от Freq1 Посмотреть сообщение
Оба эти варианта линкуются динамически?
Да.

Добавлено через 2 минуты
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Не всегда экономится место.
Разумеется.

Цитата Сообщение от Dmitriy_M Посмотреть сообщение
И хорошо бы избежать DLL hell
"Dll Hell" возникает из-за того, что находятся любители складывать dll в общие
системные локации. Если держать свои dll при себе, то их обновление ничем не грозит,
так как последствия локальны. Ну можно еще вспомнить про COM и SxS, только к
теме это имеет уже слабое отношение.
Freq1
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 48
04.05.2013, 19:17  [ТС]     В чём разница между динамической и статической линковкой библиотеки? #12
Спасибо всем за помощь.
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
24.02.2015, 21:59     В чём разница между динамической и статической линковкой библиотеки? #13
Убежденный, скажите, пожалуйста, а как подключать .so в Linux? И на что обратить внимание при их компиляции?
Убежденный
Системный программист
 Аватар для Убежденный
14183 / 6198 / 984
Регистрация: 02.05.2013
Сообщений: 10,324
Завершенные тесты: 1
24.02.2015, 22:07     В чём разница между динамической и статической линковкой библиотеки? #14
Цитата Сообщение от andrejap Посмотреть сообщение
как подключать .so в Linux?
Это не по адресу. Мой уровень в Linux - "блондинка, 1st level".
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.02.2015, 22:22     В чём разница между динамической и статической линковкой библиотеки?
Еще ссылки по теме:

Переменные в статической и динамической памяти! C++
Односвязный список: В чём разница между struct и class? C++
Вызов функции одной динамической библиотеки из другой динамической библиотеки C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
24.02.2015, 22:22     В чём разница между динамической и статической линковкой библиотеки? #15
Убежденный, сорри. И на том спасибо.
Yandex
Объявления
24.02.2015, 22:22     В чём разница между динамической и статической линковкой библиотеки?
Ответ Создать тему
Опции темы

Текущее время: 03:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru