Статически исполняемый файл содержит все необходимые ему объекты, поэтому при выполнении не будет вызываться внешняя DLL. Преимущество заключается в том, что он переносим на многие платформы независимо от того, какая версия DLL установлена в этой системе. БОЛЬШОЙ недостаток заключается в том, что вы, вероятно, тратите место на диске, так как включаете в свой исполняемый код, который уже присутствует в системных / внешних DLL. Более того, я думаю, но я не очень уверен, что библиотеки DLL загружаются в основную память только один раз, независимо от того, сколько исполняемых файлов используют их, но если вы статически связываете объекты библиотеки внутри вашего исполняемого файла, вы загружаете один и тот же код дважды (один для DLL, используемой остальными программами, и одну для вашего исполняемого файла). С другой стороны, это может быть преимуществом, а не недостатком, поскольку исполняемый файл содержит только те объекты необходимых ему внешних библиотек, а не всю библиотеку. DLL загружается в память в целом, когда это требуется приложению.
Статическое связывание идеально подходит для компиляции небольших приложений, которые вы хотите перенести из одной системы в другую в качестве небольшого инструмента. То есть для меня было действительно полезно иметь статически скомпилированную версию tcpdump, когда она не была включена в каждый дистрибутив Linux. Он должен был работать на каждом Linux, независимо от того, какая версия ядра, glibc или других системных библиотек. Возможно, это не имеет особого смысла в мире Windows, поскольку платформы гораздо более однородны. Если вы компилируете для Windows XP / NET vX.X, он будет работать на многих компьютерах. Если вы скомпилируете что-то для Debian X.X, это, безусловно, не будет работать на старых / новых Debian или других дистрибутивах, таких как Redhat.
Эта тема также может решить ваши вопросы.