Подтвердить что ты не робот

Почему для моего приложения требуется пакет с возможностью перераспределения Visual С++

Я пишу простое приложение C++ в Visual Studio. У него также есть проект установки. Он хорошо работает на моей машине разработки, но когда я устанавливаю это приложение на пользовательскую машину, он требует Visual C++ Redistributable Package. Мне интересно, почему мое приложение требует C++ Redistributable? Стандартная C++ библиотека времени исполнения поставляется с Windows, не так ли?

4b9b3361

Ответ 1

Библиотека C runtime только, поставляемая Microsoft с большинством 32-битных версий Windows, msvcrt.dll. Эта библиотека предоставляет типичный набор библиотечных функций, требуемых программами C и C++. К ним относятся string manipulation, memory allocation, C-style input/output calls и т.д.
Visual Studio 6.0 s с этой библиотекой, поэтому, если вы работаете в VS 6.0, вы не должны обнаруживать никаких проблем на большинстве компьютеров пользователей.
Однако, если вы разрабатываете в VS 2005, VS 2008, VS 2010, VS 2012, VS 2013 или VS 2015, вам необходимо распространять дополнительные библиотеки C runtime вместе с вашим приложением. Это связано с тем, что их компиляторы связаны с msvcrt80.dll, msvcrt90.dll, msvcrt100.dll, msvcrt110.dll, msvcrt120.dll и msvcrt140.dll соответственно, которые не поставляются с окнами.

Решения:

  • Возможное решение - связать статически с библиотекой времени выполнения, но это может вызвать множество проблем, если в вашем приложении есть как .exe, так и .dll. Не делайте этого.
    Чтобы быть более конкретным, я позволю себе процитировать часть этого ответа:

    Использование/MT является рискованным, если вы создаете библиотеки DLL, а также EXE. Вы закончите с несколькими копиями ЭЛТ в вашей программе. Это было особенно проблема с более ранними версиями VS, где каждый CRT получал бы свои собственные куча, не столько с VS2012. Но у вас все еще может быть уродливое время выполнения проблемы, если у вас более одной переменной "errno", например. Использование /MD настоятельно рекомендуется избегать такого снижения.

  • Еще одно возможное решение - потребовать, чтобы на компьютере пользователя был установлен соответствующий пакет Microsoft Visual C++ Redistributable.
    Это можно сделать, указав это требование в свойстве предварительных условий в вашем проекте установки.

  • Кроме того, вы можете распространять среду выполнения dll, включив в свой проект настройки соответствующий merge module. В этом случае не забудьте добавить соответствующий policy merge module, чтобы избежать ошибок, вызванных неправильной версией времени выполнения.
  • Наконец, вы можете просто поместить требуемый dll в ту же папку, в которой установлено ваше приложение.

Перераспределение файлов Visual С++ - Официальная документация MSDN

Ответ 2

Несмотря на то, что в некоторых комментариях говорилось, что "ссылка статична с библиотекой времени выполнения, но это может вызвать множество проблем, когда в приложении есть как .exe, так и .dll". это НЕ ИСТИНА. Сначала мы НЕ статически связываем DLL! Мы статически связываем OBJ и LIB. LIB - это статические библиотеки; DLL - это динамические библиотеки, и вы можете использовать LIB (статические) или DLL (динамические). Это полностью зависит от вас. Единственный недостаток (для поклонников DLL) заключается в том, что если вы хотите обновить одну библиотеку, вам нужно будет скомпилировать и снова связать. Я лично развертываю ВСЕ мое статическое программное обеспечение, и из-за этого я зарабатываю бонус, даже не нуждаюсь в установщиках. Программное обеспечение, которое я разрабатываю, на 100% переносится (функция, которая в эпоху до установки была общей процедурой), и конечный пользователь может свободно выполнять COPY из одной папки в другую или даже с жесткого диска на флешку (или вице- Versa). Сообщение об ошибке "DLL не найдено." Просто не существует... НИКОГДА.

Некоторые люди думают о статической связи как игрушечного программного обеспечения: НЕПРАВИЛЬНО! Я могу написать полнофункциональное приложение, которое подключается к СУБД (Oracle, SQL Server,...) или к любому другому приложению.