Разница между статическими и общими библиотеками? - PullRequest
513 голосов
/ 16 апреля 2010

В чем разница между статическими и общими библиотеками?

Я использую Eclipse, и есть несколько типов проектов, включая статические библиотеки и общие библиотеки? Есть ли у одного преимущество над другим?

Ответы [ 8 ]

700 голосов
/ 16 апреля 2010

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

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

У каждого метода есть свои преимущества и недостатки.

Совместно используемые библиотеки уменьшают объем кода, который дублируется в каждой программе, использующей библиотеку, сохраняя размер двоичных файлов небольшим. Это также позволяет вам заменить общий объект функционально эквивалентным, но может иметь дополнительные преимущества в производительности без необходимости перекомпиляции программы, которая его использует. Совместно используемые библиотеки, однако, будут иметь небольшую дополнительную стоимость для выполнения функций, а также стоимость загрузки во время выполнения, поскольку все символы в библиотеке должны быть связаны с тем, что они используют. Кроме того, общие библиотеки могут быть загружены в приложение во время выполнения, что является общим механизмом для реализации бинарных подключаемых систем.

Статические библиотеки увеличивают общий размер двоичного файла, но это означает, что вам не нужно иметь при себе копию используемой библиотеки. Поскольку код подключен во время компиляции, никаких дополнительных затрат на загрузку во время выполнения не возникает. Код просто там.

Лично я предпочитаю разделяемые библиотеки, но использую статические библиотеки, когда необходимо убедиться, что двоичный файл не имеет много внешних зависимостей, которые могут быть трудно встретить, таких как конкретные версии стандартной библиотеки C ++ или конкретные версии Boost C ++ библиотека.

364 голосов
/ 16 апреля 2010

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

63 голосов
/ 16 апреля 2010

Упрощенная:

  • Статическое связывание: один большой исполняемый файл
  • Динамическое связывание: небольшой исполняемый файл плюс один или несколько библиотечных файлов (файлы .dll в Windows, .so в Linux или .dylib в macOS)
32 голосов
/ 16 апреля 2010

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

Для разделяемой библиотеки компилятор / компоновщик проверяет, что имена, с которыми вы связываетесь, существует в библиотеке при сборке приложения, но не перемещает их код в приложение. Во время выполнения общая библиотека должна быть доступна.

Сам язык программирования C не имеет понятия ни о статических, ни о разделяемых библиотеках - они полностью реализованы.

Лично я предпочитаю использовать статические библиотеки, так как это упрощает распространение программного обеспечения. Тем не менее, это мнение, по которому много (фигуративной) крови пролилось в прошлом.

28 голосов
/ 16 апреля 2010

Статические библиотеки компилируются как часть приложения, тогда как разделяемые библиотеки - нет. Когда вы распространяете приложение, которое зависит от общих библиотек, библиотек, например. DLL на MS Windows должны быть установлены.

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

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

17 голосов
/ 16 апреля 2010

Самым значительным преимуществом разделяемых библиотек является то, что в память загружается только одна копия кода, независимо от того, сколько процессов использует библиотеку. Для статических библиотек каждый процесс получает свою собственную копию кода. Это может привести к значительным потерям памяти.

OTOH, преимущество статических библиотек заключается в том, что все включено в ваше приложение. Поэтому вам не нужно беспокоиться о том, что у клиента будет правильная библиотека (и версия), доступная в его системе.

6 голосов
/ 30 октября 2017

Помимо всех остальных ответов, еще одна вещь, о которой еще не упоминалось, это разделение:

Позвольте мне рассказать о реальном производственном коде, с которым я имел дело:

Очень большое программное обеспечение, состоящее из> 300 проектов (с визуальной студией), в основном собранное в виде статической библиотеки и, наконец, все объединенное в один огромный исполняемый файл, вы сталкиваетесь со следующими проблемами:

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

Более проблематичным является разделение вашего программного обеспечения: в этом реальном примере файлы заголовков каждого проекта можно было повторно подключить из любых других проектов. Как следствие, одному разработчику было очень легко добавлять зависимости; речь шла просто о включении заголовка, потому что ссылка в конце всегда найдет символы. Это заканчивается ужасными велосипедными зависимостями и полным беспорядком.

С разделяемой библиотекой это немного лишняя работа, потому что разработчик должен отредактировать систему сборки проекта, чтобы добавить зависимую библиотеку. Я заметил, что код разделяемой библиотеки имеет тенденцию предлагать более чистый код API.

0 голосов
/ 20 февраля 2019
-------------------------------------------------------------------------
|  +-  |    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  |                                     |
-------------------------------------------------------------------------
...