Как статическое связывание работает с системными файлами? - PullRequest
0 голосов
/ 18 июня 2019

Я начинающий программист на C ++ и пытаюсь создать полностью статическую программу (только один .exe) в Visual Studio.Это заставило меня задуматься, потому что есть некоторые внешние зависимости, которые извлекаются из компьютера пользователя, такие как MSVCP.dll.Эти зависимости запечатываются в программу с компьютера программиста, или они все еще не учитываются и извлекаются пользователем?

-Ari

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Компилятор MS Visual C ++ дает вам возможность выбрать, какую версию библиотеки времени выполнения MS Visual C / C ++ вы хотите связать.Возможны следующие варианты:

  • / MT - Статическая ссылка на неотлаженную многопоточную версию CRT.Это дает преимущество, заключающееся в том, что вам не требуется поставлять библиотеки CRT вместе с приложением, что может потребоваться для его запуска в некоторых системах в противном случае.Недостатком является то, что код CRT, используемый вашим приложением, должен быть встроен в ваш исполняемый файл, увеличивая его размер.Это усложняется, если в вашем приложении имеется несколько исполняемых файлов и библиотек DLL, поскольку в каждый из них необходимо будет вставить много одинакового кода CRT.
  • / MTd - Статически связать отладочную многопоточную версию CRT.То же, что и выше, но добавленная информация об отладке сделает его работу медленнее и станет еще больше.В основном полезно для сборок разработки.
  • / MD - Динамически связывать с DLL в неотлаженной многопоточной версии CRT.Это может уменьшить размер исполняемого файла вашей программы.Эта экономия может быть усугублена, если ваше приложение состоит из нескольких исполняемых файлов и библиотек DLL, поскольку они могут совместно использовать один и тот же код CRT.Это может потребовать, чтобы вы поставили библиотеки DLL CRT или пользователи могли установить их отдельно, хотя это может быть дополнительной трудностью и сложностью.
  • / MDd - Динамически связывать с DLL отладочной многопоточной версии CRT.То же, что и выше, но добавленная информация об отладке будет работать медленнее.В основном полезно для разработки.

При быстром тестировании с помощью простой программы hello world скомпилированный исполняемый файл в итоге получил около 12 КБ с / MD, а его вес - около 219 КБ с / MT, поэтомуРазница в размерах значительна, особенно если вы отправляете много небольших программ.


Раньше были также однопоточные версии библиотеки, которые теоретически могли обеспечить лучшую однопоточную производительность.и меньшего размера, но они больше не предоставляются с более новыми версиями ЭЛТ.Предположительно, различие было слишком незначительным, чтобы иметь смысл отправлять целую отдельную сборку библиотеки.

1 голос
/ 18 июня 2019

Эти зависимости запечатываются в программу с компьютера программиста или они все еще не учитываются пользователем?

Как @Igor комментарии, вы можете сделать либо. Разница заключается в том, что (возможно, довольно большой) один независимый статически связанный исполняемый файл или файл, который зависит от запуска локальных DLL.

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