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

518
задан Mohit Deshpande 6 April 2012 в 05:30
поделиться

6 ответов

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

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

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

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

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

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

720
ответ дан 22 November 2019 в 22:24
поделиться

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

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

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

29
ответ дан 22 November 2019 в 22:24
поделиться

Упрощенное:

  • Статическое связывание: один большой исполняемый файл
  • Динамическое связывание: небольшой исполняемый файл плюс один или несколько файлов библиотеки (файлы .dll в Windows, .so в Linux или .dylib в macOS)
66
ответ дан 22 November 2019 в 22:24
поделиться

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

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

17
ответ дан 22 November 2019 в 22:24
поделиться

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

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

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

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

33
ответ дан 22 November 2019 в 22:24
поделиться

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

371
ответ дан 22 November 2019 в 22:24
поделиться