Когда использовать динамические и статические библиотеки - PullRequest
413 голосов
/ 26 сентября 2008

При создании библиотеки классов в C ++ вы можете выбирать между динамическими (.dll, .so) и статическими (.lib, .a) библиотеками. В чем разница между ними и когда уместно использовать какие?

Ответы [ 18 ]

5 голосов
/ 26 сентября 2008

Для отличного обсуждения этой темы прочитайте эту статью от Sun.

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

4 голосов
/ 26 сентября 2008

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

3 голосов
/ 26 сентября 2008

Если ваша библиотека будет разделена между несколькими исполняемыми файлами, часто имеет смысл сделать ее динамической, чтобы уменьшить размер исполняемых файлов. В противном случае, определенно сделайте это статичным.

Есть несколько недостатков использования DLL. Есть дополнительные накладные расходы для загрузки и выгрузки. Существует также дополнительная зависимость. Если вы измените dll, чтобы сделать его несовместимым с вашими executalbes, они перестанут работать. С другой стороны, если вы измените статическую библиотеку, ваши скомпилированные исполняемые файлы, использующие старую версию, не будут затронуты.

3 голосов
/ 26 сентября 2008

Если библиотека статическая, то во время компоновки код связывается с вашим исполняемым файлом. Это делает ваш исполняемый файл больше (чем если бы вы пошли динамический маршрут).

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

Если вы можете жить со статической библиотекой, используйте статическую библиотеку.

2 голосов
/ 02 октября 2013

Мы используем много DLL (> 100) в нашем проекте. Эти библиотеки DLL зависят друг от друга, и поэтому мы выбрали настройку динамического связывания. Однако он имеет следующие недостатки:

  • медленный запуск (> 10 секунд)
  • DLL должны быть версионными, так как Windows загружает модули по уникальности имен. В противном случае собственные написанные компоненты могут получить неправильную версию DLL (т.е. уже загруженную вместо собственного распределенного набора)
  • оптимизатор может оптимизировать только в пределах DLL. Например, оптимизатор пытается разместить часто используемые данные и код рядом друг с другом, но это не будет работать за пределами DLL

Возможно, лучшей настройкой было бы сделать все статической библиотекой (и поэтому у вас есть только один исполняемый файл). Это работает, только если не происходит дублирование кода. Тест, кажется, подтверждает это предположение, но я не смог найти официальную цитату MSDN. Так, например, сделайте 1 exe с:

  • exe использует shared_lib1, shared_lib2
  • shared_lib1 use shared_lib2
  • shared_lib2

Код и переменные shared_lib2 должны присутствовать в конечном объединенном исполняемом файле только один раз. Кто-нибудь может поддержать этот вопрос?

2 голосов
/ 26 сентября 2008

Статические библиотеки - это архивы, которые содержат объектный код для библиотеки, когда связаны с приложением, этот код компилируется в исполняемый файл. Общие библиотеки отличаются тем, что они не скомпилированы в исполняемый файл. Вместо этого динамический компоновщик ищет некоторые каталоги в поисках нужных ему библиотек, а затем загружает их в память. Более чем один исполняемый файл может одновременно использовать одну и ту же общую библиотеку, что снижает использование памяти и размер исполняемого файла. Тем не менее, есть еще файлы для распространения с исполняемым файлом. Вы должны убедиться, что библиотека установлена ​​в той системе, где ее может найти компоновщик, статическое связывание устраняет эту проблему, но приводит к увеличению размера исполняемого файла.

2 голосов
/ 26 сентября 2008

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

1 голос
/ 02 октября 2013

Я бы дал общее практическое правило: если у вас большая кодовая база, все построено поверх библиотек более низкого уровня (например, Utils или Gui Framework), которые вы хотите разделить на более управляемые библиотеки, то сделайте их статичными библиотеки. Динамические библиотеки на самом деле ничего не покупают, и сюрпризов меньше - например, будет только один экземпляр синглетонов.

Если у вас есть библиотека, которая полностью отделена от остальной базы кода (например, сторонней библиотеки), тогда подумайте о том, чтобы сделать ее dll. Если библиотека LGPL, вам может понадобиться использовать DLL в любом случае из-за условий лицензирования.

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