Різниця між статичними та спільними бібліотеками?


560

Чим відрізняються статичні та спільні бібліотеки?

Я використовую Eclipse і є кілька типів проектів, включаючи статичні бібліотеки та спільні бібліотеки? Чи має одна перевага перед іншою?


4
У Вікіпедії є хороший опис різниці між статичною, динамічною та спільною бібліотеками.
Адам Холмберг

Відповіді:


745

Спільні бібліотеки - це файли .so (або в Windows .dll, або в OS X .dylib). Весь код, що стосується бібліотеки, знаходиться в цьому файлі, і на нього посилаються програми, що використовують його під час виконання. Програма, що використовує спільну бібліотеку, посилається лише на код, який вона використовує у спільній бібліотеці.

Статичні бібліотеки - це файли .a (або в Windows .lib). Весь код, що стосується бібліотеки, знаходиться в цьому файлі, і він безпосередньо пов'язаний з програмою під час компіляції. Програма, що використовує статичну бібліотеку, бере копії коду, який він використовує, зі статичної бібліотеки та робить її частиною програми. [У Windows також є .lib-файли, які використовуються для посилання на файли .dll, але вони діють так само, як і перший].

У кожного методу є переваги та недоліки:

  • Спільні бібліотеки зменшують кількість коду, який дублюється у кожній програмі, яка використовує бібліотеку, зберігаючи двійкові файли невеликими. Він також дозволяє замінити об'єкт, що поділяється, на той, який функціонально еквівалентний, але може мати додаткові переваги в продуктивності без необхідності перекомпілювати програму, яка його використовує. Однак спільні бібліотеки матимуть невеликі додаткові витрати на виконання функцій, а також вартість завантаження під час виконання, оскільки всі символи в бібліотеці повинні бути підключені до речей, які вони використовують. Крім того, спільні бібліотеки можна завантажувати в додаток під час виконання, що є загальним механізмом реалізації бінарних плагінних систем.

  • Статичні бібліотеки збільшують загальний розмір двійкового файлу, але це означає, що вам не потрібно мати при собі копію бібліотеки, яка використовується. Оскільки код підключений під час компіляції, додаткові витрати на завантаження не виконуються. Код просто є.

Особисто я віддаю перевагу спільним бібліотекам, але використовую статичні бібліотеки, коли потрібно, щоб у двійкових не було багато зовнішніх залежностей, які можуть бути важкими для задоволення, наприклад, конкретні версії стандартної бібліотеки C ++ або конкретні версії бібліотеки Boost C ++.


2
"замінити об'єкт, що поділяється, на ... функціонально еквівалентний, але може [покращити] продуктивність": конкретно, еквівалентну функціональність, спрямована на виклик, при семантичному використанні API (інтерфейс програмування програми: функціональні підписи та змінні, включаючи типи), але на стороні реалізації функціональність може відрізнятись більше ніж perf .: наприклад, функція завжди реєструється у файл -> також увійдіть на сервер TCP: порт очікується в $ MY_APP_LOG_SERVER.
Тоні Делрой

1
"[.sos incur a] невеликі додаткові витрати на виконання функцій" - це можливо (якщо групи функцій / впорядкування були оптимізовані для кеш-локації в статичному посиланні, або через незвичайності в OS / loader / компіляторі / архітектурі, як крос -сегмент / великі покажчики перф. штрафів), але у багатьох архітектурах / компіляторах-налаштуваннях динамічний лінкер виправляє виклик, щоб створити такі самі опкоди викликової машини.
Тоні Делрой

2
"Оскільки код підключений під час компіляції, немає додаткових витрат на завантаження часу. Код просто є." - так і ні ... все це у виконаному образі, готовому до видання на екран, якщо вимагає виконання, але - починаючи з ситуації, коли ваша програма ще недавно не працювала, щоб бути в кеші, - із спільними бібліотеками це можливо (іноді ймовірно або певне), що ОС, драйвер або інша запущена програма вже завантажили ту саму спільну бібліотеку, яку хоче використовувати ваше додаток, і в цьому випадку вона може знаходитися в кеші, і програма запускається і запускається швидше.
Тоні Делрой

15
Що деякі люди не змогли згадати, це те, що зі статичними бібліотеками компілятор знає, які функції потребує ваша програма, а потім може оптимізувати її, включивши ці функції. Це може значно зменшити розмір бібліотеки, особливо якщо ви використовуєте лише невеликий підмножину дійсно великої бібліотеки!
jduncanator

1
Цю відповідь можна було б краще організувати. Було б корисно скласти списки куль для плюсів / мінусів або таблиці, щоб показати відмінності в кожному вимірі, де є різниця.
ElefEnt

377

Статична бібліотека - це як книгарня, а спільна бібліотека - як ... бібліотека. З першим ви отримуєте власну копію книги / функції, яку можна взяти додому; з останнім ви і всі інші ходите до бібліотеки, щоб використовувати ту саму книгу / функцію. Тож кожен, хто хоче користуватися (спільною) бібліотекою, повинен знати, де вона знаходиться, тому що ви повинні "піти дістати" книгу / функцію. Зі статичною бібліотекою книга / функція належить вашій власності, і ви зберігаєте її у себе вдома / програмі, і коли ви її матимете, вам не важливо, де і коли ви її отримали.


70

Спрощено:

  • Статичне з'єднання: один великий виконуваний файл
  • Динамічне посилання: невеликий виконуваний файл плюс один або кілька бібліотечних файлів (.dll файли в Windows, .so в Linux або .dylib на macOS)

1
Ця відповідь для мене найкраща, тому що вона практична. Це має набагато більше сенсу, ніж метафора, яка не говорить про те, що насправді відбувається в комп'ютері. Знаючи, що саме так і відбувається, я просто інтуїтивно знаю всі інші наслідки.
off99555

36

Для статичної бібліотеки код витягується з бібліотеки за допомогою лінкера і використовується для побудови остаточного виконуваного файлу в точці, яку ви компілюєте / будуєте у вашій програмі. Остаточний виконуваний файл не має залежностей від бібліотеки під час виконання

Для спільної бібліотеки компілятор / лінкер перевіряє, чи є імена, з якими ви зв’язуєтесь, у бібліотеці, коли програма створена, але не переміщує їх код у програму. Під час виконання спільна бібліотека повинна бути доступною.

Сама мова програмування C не має поняття ні статичних, ні спільних бібліотек - вони є повністю функцією реалізації.

Особисто я вважаю за краще використовувати статичні бібліотеки, оскільки це робить спрощення розповсюдження програмного забезпечення. Однак це думка, за яку в минулому пролито багато (образної) крові.


5
+1 для "Сама мова програмування на C не має поняття ні статичних, ні спільних бібліотек - вони є повністю функцією реалізації".
Тигр

1
Привіт anon / @Tiger, чому ви заявили: "Сама мова програмування C не має поняття ні статичних, ні спільних бібліотек - вони є повністю функцією реалізації". Чи можете ви, будь ласка, пояснити трохи детально або вказати мені на відповідне посилання?
Суніл Шаху

@SunilShahu Як компілюється та зв’язується програма, є специфічним для компілятора та лінкера, який ви використовуєте, тобто конкретної реалізації мови. Мовні характеристики зазвичай не описують, як мови повинні бути реалізовані чи побудовані, лише функціональність, синтаксис, граматика тощо
JC Rocamonde

@SunilShahu більш очевидними прикладами може бути JavaScript, наприклад, де специфікація (EcmaScript) описує особливості мови, але саме різні постачальники постачають JS-перекладачі (наприклад, двигуни браузера або Node.js). З іншого боку, мова програмування Python має кілька реалізацій. Офіційний - CPython, але є й інші, написані іншими мовами.
JC Rocamonde

31

Статичні бібліотеки збираються як частина програми, тоді як спільні бібліотеки - ні. Коли ви поширюєте програму, яка залежить від спільних бібліотек, бібліотеки, наприклад. dll's на MS Windows потрібно встановити.

Перевага статичних бібліотек полягає в тому, що для користувача, який запускає додаток, немає необхідних залежностей - наприклад, їм не потрібно оновлювати DLL будь-якого. Недоліком є ​​те, що ваша програма має більший розмір, оскільки ви доставляєте її з усіма необхідними йому бібліотеками.

Окрім залучення до менших додатків, спільні бібліотеки пропонують користувачеві користуватися власною, можливо, кращою версією бібліотек, а не покладатися на ту, що є частиною програми


3
DLL пекло, як відомо,
гуси

1
"Статичні бібліотеки збираються як частина програми" ... статичні бібліотеки збираються як статичні бібліотеки і пов'язані як частина програми
idclev 463035818

19

Найбільш істотною перевагою бібліотек, що поділяються, є те, що в пам'яті є лише одна копія коду, незалежно від того, скільки процесів використовує бібліотека. Для статичних бібліотек кожен процес отримує власну копію коду. Це може призвести до значного витрачання пам'яті.

ОТОГ, перевага статичних бібліотек полягає в тому, що все входить у вашу програму. Тож вам не потрібно хвилюватися, що клієнт матиме потрібну бібліотеку (та версію), доступну у своїй системі.


1
виконується зображення більше на диску, а також у пам'яті при використанні статичних ліб.
JustJeff

Це правильно, саме на це я і натякав, коли сказав, що все є у вашій заявці.
Джасмет

Крім того, .soфайли у * nix-системах є своєрідними спільними (динамічними) бібліотеками.
ЗСШ

6

На додаток до всіх інших відповідей, одна річ, яка ще не згадується, - це відокремлення:

Дозвольте мені розповісти про реальний світовий виробничий код, з яким я мав справу:

Дуже велике програмне забезпечення, що складається з> 300 проектів (із візуальною студією), здебільшого створюється як статична ліб і, нарешті, все з’єднується в один величезний виконуваний файл, у вас виникають такі проблеми:

-Час посилання надзвичайно довгий. Ви можете закінчити більше 15 хвилин посилання, скажімо, 10 секунд часу на компіляцію - Деякі інструменти стоять на коліні з таким великим виконуваним файлом, як інструменти перевірки пам’яті, які повинні інструментувати код. Ви можете потрапити в досягнення меж, які розглядалися як дурні.

Більш проблематичним є роз'єднання вашого програмного забезпечення: на цьому реальному прикладі файли заголовків кожного проекту були доступні для будь-яких інших проектів. Як наслідок, одному розробнику було надзвичайно просто додати залежності; мова йшла тільки про включення заголовка, тому що посилання в кінці все-таки знайде символи. Це закінчується жахливими велосипедними залежностями та повним безладом.

Зі спільною бібліотекою це зайва робота, оскільки розробник повинен редагувати систему збирання проекту, щоб додати залежну бібліотеку. Я помітив, що код спільної бібліотеки, як правило, пропонує чистіший код API.


2
-------------------------------------------------------------------------
|  +-  |    Shared(dynamic)       |   Static Library (Linkages)         |
-------------------------------------------------------------------------
|Pros: | less memory use          |   an executable, using own libraries|
|      |                          |     ,coming with the program,       |
|      |                          |   doesn't need to worry about its   |
|      |                          |   compilebility subject to libraries|
-------------------------------------------------------------------------
|Cons: | implementations of       |   bigger memory uses                |
|      | libraries may be altered |                                     |
|      | subject to OS  and its   |                                     |
|      | version, which may affect|                                     |
|      | the compilebility and    |                                     |
|      | runnability of the code  |                                     |
-------------------------------------------------------------------------
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.