Каковы преимущества и недостатки статической привязки библиотеки?
=================================================================

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

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

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

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

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

 

Плюсы:   

Без зависимостей.

Минусы:   

Более высокое использование памяти, поскольку ОС больше не может использовать общую копию библиотеки.   

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

 .i1a { width: 336px; height: 280px; }
 @media(min-width: 768px) { .i1a { width: 728px; height: 90px; } }
 @media(min-width: 992px) { .i1a { width: 360px; height: 300px; } }
 @media(min-width: 1083px) { .i1a { width: 728px; height: 90px; } }

 (adsbygoogle = window.adsbygoogle || []).push({});

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

 

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

 .i2a { width: 336px; height: 280px; }
 @media(min-width: 768px) { .i2a { width: 728px; height: 90px; } }
 @media(min-width: 992px) { .i2a { width: 360px; height: 300px; } }
 @media(min-width: 1083px) { .i2a { width: 728px; height: 90px; } }

 (adsbygoogle = window.adsbygoogle || []).push({});

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

 

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

 

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

Однако вышеупомянутая проблема в динамически связанных библиотеках может быть устранена [динамическая загрузка](http://en.wikipedia.org/wiki/Dynamic_loading).