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