Я пишу простое приложение C++
в Visual Studio. Он также имеет проект установки. Оно хорошо работает на моем компьютере для разработки, но когда я устанавливаю это приложение на компьютере пользователя, для него требуется Visual C++ Redistributable Package
. Мне интересно, почему моему приложению требуется C++ Redistributable
? Стандартная C++
библиотека времени выполнения поставляется вместе с Windows, не так ли?
Почему для моего приложения требуется распространяемый пакет Visual C++?
Ответы (2)
Единственная версия библиотеки времени выполнения C, которая поставляется Microsoft с большинством 32-разрядных версий Windows, — msvcrt.dll
. Эта библиотека предоставляет стандартный набор библиотечных функций, необходимых для программ на C и C++. К ним относятся манипуляции со строками, выделение памяти, вызовы ввода-вывода в стиле C и т. д.
Компилятор Visual Studio 6.0 связывается с этой библиотекой, поэтому, если вы разрабатываете в VS 6.0, у вас не должно возникнуть никаких проблем на компьютерах большинства пользователей.
Однако, если вы разрабатываете в VS 2005, VS 2008, VS 2010, VS 2012, VS 2013 или VS 2015, вам необходимо распространять дополнительные библиотеки времени выполнения C вместе с вашим приложением. Это связано с тем, что их компиляторы ссылаются на msvcrt80.dll
, msvcrt90.dll
, msvcrt100.dll
, msvcrt110.dll
, msvcrt120.dll
и msvcrt140.dll
соответственно, которые не поставляются с Windows.
Решения:
- #P4# #P5# <блочная цитата> #P6# блочная цитата>
Другое возможное решение — потребовать, чтобы на компьютере пользователя был установлен соответствующий распространяемый пакет Microsoft Visual C++.
Это можно сделать, указав это требование в свойстве предварительных условий в вашем проекте установки.
Кроме того, вы можете распространять среду выполнения
dll
, включив в проект установки соответствующий "модуль слияния". В этом случае не забудьте добавить соответствующий «модуль слияния политик», чтобы избежать ошибок, вызванных неправильной версией среды выполнения.Наконец, вы можете просто поместить необходимые библиотеки DLL в ту же папку, в которой установлено ваше приложение.
Дальнейшее чтение:
- «Распространение файлов Visual C++" — официальная документация MSDN
mixing
статическая компоновка с динамической компоновкой сопряжена с рисками, о которых вам нужно знать. Вариант № 4 (параллельное развертывание) или вариант № 3 (интеллектуальная установка) являются наиболее безопасными.
- person Jesse Chisholm; 24.08.2015
Несмотря на то, что в некоторых комментариях говорилось, что «связывайтесь статически с библиотекой времени выполнения, но это может вызвать много проблем, если в вашем приложении есть и .exe, и .dll». это неправда. Во-первых, мы НЕ связываем библиотеки DLL статически! Мы статически связываем OBJ и LIB. LIB — это статические библиотеки; DLL — это динамические библиотеки, и вы можете использовать LIB (статические) или DLL (динамические). Это полностью зависит от вас, чтобы выбрать. ЕДИНСТВЕННЫЙ недостаток (для фанатов DLL) заключается в том, что если вы хотите обновить одну библиотеку, вам нужно снова скомпилировать и скомпоновать. Я лично развертываю ВСЕ свое программное обеспечение со статическими ссылками, и благодаря этому я получаю бонус в виде того, что мне даже не нужны установщики. Программное обеспечение, которое я разрабатываю, является на 100% переносимым (функция, которая в эпоху предустановки была обычной процедурой), и конечный пользователь может просто КОПИРОВАТЬ из одной папки в другую или даже с жесткого диска на флэш-накопитель (или наоборот). наоборот). Сообщение об ошибке «DLL не найдена». просто не существует... НИКОГДА.
Некоторые считают статические компоновки игрушечным программным обеспечением: НЕПРАВИЛЬНО! Я могу написать полнофункциональное приложение, которое подключается к СУБД (Oracle, SQL Server, ...) или любому другому приложению.
interface stability
, когда вы вносите изменения в свои динамические библиотеки. @binyan отметил, что при использовании сторонних .dll у вас нет контроля, статическая ссылка на общую библиотеку может вызвать проблемы в будущем. Ваше приложение сломано из-за изменения dll вне вашего контроля.
- person Jesse Chisholm; 24.08.2015