Каковы плюсы и минусы статического связывания библиотеки?

Я хочу выпустить приложение, которое я разработал как хобби как для Linux, так и для Windows. Это приложение зависит от boost (и, возможно, других библиотек). Нормой для такого рода приложений (шахматный движок) является предоставление только исполняемого файла и, возможно, некоторых вспомогательных файлов.

Я жестко, было бы неплохо статически связать библиотеки, чтобы исполняемый файл не имел никаких зависимостей. Так что конечный пользователь может просто поместить исполняемый файл в каталог и начать использовать он.

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

Итак, каковы плюсы и минусы статически связывающей библиотеки?

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

4 ответов


плюсы:
Никаких зависимостей.

плюсы:
Более высокое использование памяти, так как ОС больше не может использовать общую копию библиотеки.
Если библиотека нуждается в обновлении, приложение необходимо перестроить. Это вдвойне важно для библиотек, которые затем имеют исправления безопасности.

конечно, большей проблемой для переносимости является отсутствие распространения исходного кода.


предположим, что статическая библиотека "A", которую вы включаете, зависит от функции"B". Если эта зависимость не может быть выполнена целевой системой, ваша программа не будет запущена.

но если вы используете динамическую компоновку, пользователь может установить другую версию библиотеки "A", которая использует функцию" C "вместо" B", чтобы она могла успешно работать.


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


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

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