Где я должен использовать статическую библиотеку в C ++ - PullRequest
2 голосов
/ 14 января 2010

Каковы случаи использования статических библиотек в C ++? Я видел, что вместо этого люди создают DLL или те, которые используют только статические библиотеки. Какова ваша рекомендация?

Ответы [ 7 ]

5 голосов
/ 14 января 2010

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

Статические библиотеки открывают двери для многих оптимизаций, которые вы не можете сделать с динамическими библиотеками, потому что они выполняются во время компоновки. В мире Microsoft Link Time Code Generation (LTCG) дает вам возможность выполнять оптимизацию всей программы и удаление мертвого кода не только через ваше приложение, но и через ваши библиотеки (в gcc это называется Link Time Optimization [LTO])

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

3 голосов
/ 14 января 2010

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

Часть «И» труднее всего выполнить: обычно вы отправляете свое приложение с любыми новыми функциональными возможностями и никогда не обновляете библиотеку без одновременного обновления приложения (я не говорю, что этого никогда не происходит), но обычно это два корабль в шаге.

В противном случае проще просто собрать нормальные библиотеки и отправить приложение.

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

2 голосов
/ 14 января 2010

В общем, хотя из этого правила всегда есть исключения, я бы сказал:

Преимущества DLL

  • Меньше использования физической памяти при запуске нескольких экземпляров приложения. (Копирование при записи оптимизация использования памяти.)
  • Более быстрое время ссылки.
  • Меньшие исполняемые файлы.
  • Лучшая модульность.

Преимущества статических библиотек

  • Меньше использования виртуальной памяти (и, вероятно, меньше физической памяти) при запуске одного экземпляра приложения.
  • Производительность. Примерно на 10% (более или менее) улучшение по сравнению с DLL, в зависимости от вашего приложения.
  • Надежность. Вы протестировали свое приложение в отношении определенной версии (или определенных версий) библиотеки. Обновление до DLL может потенциально сломать ваше приложение.
1 голос
/ 14 января 2010

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

1 голос
/ 14 января 2010

Преимущество заключается в том, что вам не нужно перекомпилировать всю программу, если вы вносите изменения в динамически связанную библиотеку. @Chris делает хорошее замечание о dll-hell, но если это незначительное исправление ошибки, которое не влияет на API, это может спасти вас от перекомпиляции.

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

0 голосов
/ 14 января 2010

Я использую статические библиотеки для реализации концепции «пакета» в UML. Все модули, принадлежащие пакету, помещаются в их собственный подкаталог, и я создаю подпроект IDE или make-файл для этого каталога, который создает статическую библиотеку * .a файл. Современные IDE позволяют работать с вашим пакетом верхнего уровня вместе с подпакетами в одном «рабочем пространстве».

Если пакет (или группу пакетов) можно развернуть отдельно от основного исполняемого файла, я вместо этого скомпилирую его в общую библиотеку (* .so или * .dll) и считаю его «компонентом» на языке UML .

0 голосов
/ 14 января 2010

Что ж, статическая DLL-библиотека предназначена для хранения огромных библиотек, а также для использования охлаждения Multi-Os, как я ее называю, чтобы ее можно было запускать в Linux, Windows ...

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