Чим відрізняються статичні та спільні бібліотеки?
Я використовую Eclipse і є кілька типів проектів, включаючи статичні бібліотеки та спільні бібліотеки? Чи має одна перевага перед іншою?
Чим відрізняються статичні та спільні бібліотеки?
Я використовую Eclipse і є кілька типів проектів, включаючи статичні бібліотеки та спільні бібліотеки? Чи має одна перевага перед іншою?
Відповіді:
Спільні бібліотеки - це файли .so (або в Windows .dll, або в OS X .dylib). Весь код, що стосується бібліотеки, знаходиться в цьому файлі, і на нього посилаються програми, що використовують його під час виконання. Програма, що використовує спільну бібліотеку, посилається лише на код, який вона використовує у спільній бібліотеці.
Статичні бібліотеки - це файли .a (або в Windows .lib). Весь код, що стосується бібліотеки, знаходиться в цьому файлі, і він безпосередньо пов'язаний з програмою під час компіляції. Програма, що використовує статичну бібліотеку, бере копії коду, який він використовує, зі статичної бібліотеки та робить її частиною програми. [У Windows також є .lib-файли, які використовуються для посилання на файли .dll, але вони діють так само, як і перший].
У кожного методу є переваги та недоліки:
Спільні бібліотеки зменшують кількість коду, який дублюється у кожній програмі, яка використовує бібліотеку, зберігаючи двійкові файли невеликими. Він також дозволяє замінити об'єкт, що поділяється, на той, який функціонально еквівалентний, але може мати додаткові переваги в продуктивності без необхідності перекомпілювати програму, яка його використовує. Однак спільні бібліотеки матимуть невеликі додаткові витрати на виконання функцій, а також вартість завантаження під час виконання, оскільки всі символи в бібліотеці повинні бути підключені до речей, які вони використовують. Крім того, спільні бібліотеки можна завантажувати в додаток під час виконання, що є загальним механізмом реалізації бінарних плагінних систем.
Статичні бібліотеки збільшують загальний розмір двійкового файлу, але це означає, що вам не потрібно мати при собі копію бібліотеки, яка використовується. Оскільки код підключений під час компіляції, додаткові витрати на завантаження не виконуються. Код просто є.
Особисто я віддаю перевагу спільним бібліотекам, але використовую статичні бібліотеки, коли потрібно, щоб у двійкових не було багато зовнішніх залежностей, які можуть бути важкими для задоволення, наприклад, конкретні версії стандартної бібліотеки C ++ або конкретні версії бібліотеки Boost C ++.
Статична бібліотека - це як книгарня, а спільна бібліотека - як ... бібліотека. З першим ви отримуєте власну копію книги / функції, яку можна взяти додому; з останнім ви і всі інші ходите до бібліотеки, щоб використовувати ту саму книгу / функцію. Тож кожен, хто хоче користуватися (спільною) бібліотекою, повинен знати, де вона знаходиться, тому що ви повинні "піти дістати" книгу / функцію. Зі статичною бібліотекою книга / функція належить вашій власності, і ви зберігаєте її у себе вдома / програмі, і коли ви її матимете, вам не важливо, де і коли ви її отримали.
Спрощено:
Для статичної бібліотеки код витягується з бібліотеки за допомогою лінкера і використовується для побудови остаточного виконуваного файлу в точці, яку ви компілюєте / будуєте у вашій програмі. Остаточний виконуваний файл не має залежностей від бібліотеки під час виконання
Для спільної бібліотеки компілятор / лінкер перевіряє, чи є імена, з якими ви зв’язуєтесь, у бібліотеці, коли програма створена, але не переміщує їх код у програму. Під час виконання спільна бібліотека повинна бути доступною.
Сама мова програмування C не має поняття ні статичних, ні спільних бібліотек - вони є повністю функцією реалізації.
Особисто я вважаю за краще використовувати статичні бібліотеки, оскільки це робить спрощення розповсюдження програмного забезпечення. Однак це думка, за яку в минулому пролито багато (образної) крові.
Статичні бібліотеки збираються як частина програми, тоді як спільні бібліотеки - ні. Коли ви поширюєте програму, яка залежить від спільних бібліотек, бібліотеки, наприклад. dll's на MS Windows потрібно встановити.
Перевага статичних бібліотек полягає в тому, що для користувача, який запускає додаток, немає необхідних залежностей - наприклад, їм не потрібно оновлювати DLL будь-якого. Недоліком є те, що ваша програма має більший розмір, оскільки ви доставляєте її з усіма необхідними йому бібліотеками.
Окрім залучення до менших додатків, спільні бібліотеки пропонують користувачеві користуватися власною, можливо, кращою версією бібліотек, а не покладатися на ту, що є частиною програми
Найбільш істотною перевагою бібліотек, що поділяються, є те, що в пам'яті є лише одна копія коду, незалежно від того, скільки процесів використовує бібліотека. Для статичних бібліотек кожен процес отримує власну копію коду. Це може призвести до значного витрачання пам'яті.
ОТОГ, перевага статичних бібліотек полягає в тому, що все входить у вашу програму. Тож вам не потрібно хвилюватися, що клієнт матиме потрібну бібліотеку (та версію), доступну у своїй системі.
.so
файли у * nix-системах є своєрідними спільними (динамічними) бібліотеками.
На додаток до всіх інших відповідей, одна річ, яка ще не згадується, - це відокремлення:
Дозвольте мені розповісти про реальний світовий виробничий код, з яким я мав справу:
Дуже велике програмне забезпечення, що складається з> 300 проектів (із візуальною студією), здебільшого створюється як статична ліб і, нарешті, все з’єднується в один величезний виконуваний файл, у вас виникають такі проблеми:
-Час посилання надзвичайно довгий. Ви можете закінчити більше 15 хвилин посилання, скажімо, 10 секунд часу на компіляцію - Деякі інструменти стоять на коліні з таким великим виконуваним файлом, як інструменти перевірки пам’яті, які повинні інструментувати код. Ви можете потрапити в досягнення меж, які розглядалися як дурні.
Більш проблематичним є роз'єднання вашого програмного забезпечення: на цьому реальному прикладі файли заголовків кожного проекту були доступні для будь-яких інших проектів. Як наслідок, одному розробнику було надзвичайно просто додати залежності; мова йшла тільки про включення заголовка, тому що посилання в кінці все-таки знайде символи. Це закінчується жахливими велосипедними залежностями та повним безладом.
Зі спільною бібліотекою це зайва робота, оскільки розробник повинен редагувати систему збирання проекту, щоб додати залежну бібліотеку. Я помітив, що код спільної бібліотеки, як правило, пропонує чистіший код API.
-------------------------------------------------------------------------
| +- | 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 | |
-------------------------------------------------------------------------