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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 88, средняя оценка - 4.94
Freq1
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 48
#1

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

04.05.2013, 12:48. Просмотров 14476. Ответов 14
Метки нет (Все метки)

В чём разница между динамической и статической линковкой библиотеки?
Если можно с примером.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.05.2013, 12:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос В чём разница между динамической и статической линковкой библиотеки? (C++):

Есть ли разница между подключением статической библиотеки и подключением одного только файла - C++
Есть ли вообще разница между подключением статической библиотеки, например с файлом Unit1.h и подключением одного только файла Unit1.h ...

В чём разница между заголовками <c***> и <***.h>? - C++
Пробовал несколько несложных примеров применения обоих вариантов. Результат выполнения идентичен. Компилятор никаких предупреждений не...

В чём разница между процедурами и функциями ? - C++
Мне просто нужно будет выполнить одну и ту же операцию несколько раз, а сама операция включает в себя несколько вычислений , создание...

Не объясните в чём разница между случаями - C++
Привет! Тут вот небольшой вопросик по поводу. Читаю книжку Страуструпа нашего и возник вопросик. ...

В чём разница между string и символьными массивами? - C++
Собсна какая тема, такой и вопрос. Если выразить его по-точнее, то в чём существенные плюсы того и другого в разных ситуациях? Изучаю С++...

Вызов функции одной динамической библиотеки из другой динамической библиотеки - C++
Добрый день! Помогите пожалуйста разобраться со следующим вопросом. Возможно ли из одной библиотеки передать параметры для...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
gazlan
3132 / 1907 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
04.05.2013, 14:48 #2
Динамические библиотеки - это как дрель со сменной насадкой: перед работой вставляется нужная.

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

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

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

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

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

Добавлено через 5 минут
Если можно на Code Blocks'e.
0
Убежденный
Системный программист
Эксперт С++
15558 / 7066 / 1115
Регистрация: 02.05.2013
Сообщений: 11,475
Завершенные тесты: 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, большая часть функций которых не используется.
Иногда в случае статической компоновки может быть сгенерирован более эффективный код.
7
Freq1
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 48
04.05.2013, 16:11  [ТС] #7
Убежденный, а если я неявно подключаю динамическую библиотеку, то это статическая или же динамическая линковка?
0
Убежденный
Системный программист
Эксперт С++
15558 / 7066 / 1115
Регистрация: 02.05.2013
Сообщений: 11,475
Завершенные тесты: 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;
}
4
Freq1
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 48
04.05.2013, 18:43  [ТС] #9
Убежденный, насколько мне известно именно это и називаеться явное и неявное подключение.
Оба эти варианта линкуются динамически?
0
Dmitriy_M
1349 / 1230 / 114
Регистрация: 20.03.2009
Сообщений: 4,421
Записей в блоге: 11
04.05.2013, 18:49 #10
Цитата Сообщение от Убежденный Посмотреть сообщение
В первом случае (динамика) экономится пространство на диске
Не всегда экономится место.
Цитата Сообщение от Убежденный Посмотреть сообщение
а обновление библиотеки можно сделать простой заменой dll.
И хорошо бы избежать DLL hell
1
Убежденный
Системный программист
Эксперт С++
15558 / 7066 / 1115
Регистрация: 02.05.2013
Сообщений: 11,475
Завершенные тесты: 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, только к
теме это имеет уже слабое отношение.
0
Freq1
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 48
04.05.2013, 19:17  [ТС] #12
Спасибо всем за помощь.
0
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
24.02.2015, 21:59 #13
Убежденный, скажите, пожалуйста, а как подключать .so в Linux? И на что обратить внимание при их компиляции?
0
Убежденный
Системный программист
Эксперт С++
15558 / 7066 / 1115
Регистрация: 02.05.2013
Сообщений: 11,475
Завершенные тесты: 1
24.02.2015, 22:07 #14
Цитата Сообщение от andrejap Посмотреть сообщение
как подключать .so в Linux?
Это не по адресу. Мой уровень в Linux - "блондинка, 1st level".
2
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
24.02.2015, 22:22 #15
Убежденный, сорри. И на том спасибо.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.02.2015, 22:22
Привет! Вот еще темы с ответами:

Односвязный список: В чём разница между struct и class? - C++
После неудач работы с Vector, а так же отсутствия (Хотя, скорее всего, я просто плохо искал) хорошей русской документации по нему, решил...

В чём разница между состояниями потока failbit и badbit? - C++
В чём разница между failbit и badbit? Если просто просматривать ошибку ввода в моём случае, то он всегда пишет failbit (в цикле вайл при...

Различные варианты инициализации указателя - в чём точная разница между ними? - C++
Немного непонятен один момент. Есть некий класс Statement (конструктор используется по умолчанию). Вот четыре различных записи...

Переменные в статической и динамической памяти! - C++
Народ, подскажите как этот рисунок перевести в программу! тоесть как с помощью программы разместить таким образом переменные в памяти


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
24.02.2015, 22:22
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru