| Признак | Статическая библиотека (.lib/.a) | Динамическая библиотека (.dll/.so) |
|---|---|---|
| Связывание | Код библиотеки копируется в исполняемый файл во время компиляции. | Код библиотеки загружается в память при запуске или во время выполнения программы. |
| Размер. | Увеличивает размер исполняемого файла программы. | Не влияет на размер исполняемого файла программы. |
| Обновление | Требует перекомпиляции программы для обновления функциональности. | Можно обновить или заменить без пересборки программы. |
| Зависимости | Все зависимости включаются в исполняемый файл. | Разделяет зависимости между несколькими программами. |
| Память | Каждая программа имеет свою копию кода библиотеки в памяти. | Несколько программ могут использовать одну копию библиотеки в памяти. |
| Версионирование | Сложно управлять разными версиями одной библиотеки. | Упрощается управление версиями (DLL Hell - потенциальная проблема). |
| Производительность (запуск) | Обычно быстрее запускается, так как код уже загружен. | Может задерживаться при первом запуске из-за динамической загрузки. |
| Примеры | Стандартные библиотеки C/C++ (иногда можно статически линковать). | Большинство современных системных библиотек, библиотеки GUI. |
Статическая линковка (пример):
c
c
c
При компиляции main.cpp, код функции add из static_lib.cpp будет включен непосредственно в исполняемый файл.
Динамическая линковка (пример):
c
c
c
В этом примере, программа main загружает библиотеку dynamic_lib.dll (или dynamic_lib.so) во время выполнения и вызывает функцию add через указатель.