为什么我的应用程序需要Visual C ++可再发行组件包
我正在Visual Studio中编写一个简单的C++
应用程序。 它也有一个设置项目。 它在我的开发机器上运行良好,但是当我在用户的机器上安装这个应用程序时,它需要Visual C++ Redistributable Package
。 我想知道为什么我的应用程序需要C++ Redistributable
? 标准C++
运行时库随Windows一起提供,不是吗?
由微软提供的大多数32位Windows版本的C runtime
库的唯一版本是msvcrt.dll
。 该库提供了C
和C++
程序所需的典型库函数集。 这些包括string manipulation
, memory allocation
, C-style input/output calls
等。
Visual Studio 6.0
的编译器链接到这个库,所以如果你在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
,它们不随窗口一起提供。
解决scheme:
-
可能的解决scheme是静态链接到运行时库,但是当您的应用程序中同时包含
.exe
和.dll
时,可能会导致很多问题。 不要这样做 。
更具体地说,我会让自己引用这个答案的一部分:如果你创buildDLL和EXE,使用/ MT是有风险的。 你的程序中会有多个CRT副本。 对VS的早期版本来说,这尤其是一个问题,每个CRT都会有自己的堆,而VS2012则没有这么多。 但是当你有多个“errno”variables时,你仍然可能会遇到难看的运行时问题。 强烈build议使用/ MD来避免这种损失。
-
另一种可能的解决scheme是要求在用户的计算机上安装适当的
Microsoft Visual C++ Redistributable
软件包。
可以通过在安装项目中的先决条件属性中指定此要求来完成。 - 此外,您可以通过在您的安装项目中包含适当的
merge module
来分发运行时dll
。 在这种情况下,不要忘记添加适当的policy merge module
以避免由不正确的运行时版本引起的错误。 - 最后,您可以将所需的
dll
放在您的应用程序安装在同一文件夹中。
重新分发Visual C ++文件 – 官方MSDN文档
尽pipe一些评论说:“与运行时库静态链接,但是当你的应用程序中同时存在.exe和.dll时,可能会导致很多问题。”这不是真的。 首先,我们不要静态链接DLL! 我们静态链接OBJ和LIB。 LIB是静态库; DLL是dynamic库,您可以select使用LIB(静态)或DLL(dynamic)。 这完全取决于你select。 唯一的缺点(对于dynamic链接库),如果你想更新一个库,你需要重新编译和链接。 我个人部署所有我的软件静态链接,因为我赚的奖金,甚至不需要安装程序。 我开发的软件是100%便携式(在安装前时代是一般程序),最终用户可以从一个文件夹到另一个文件夹,甚至从硬盘驱动器到闪存驱动器(或副驱动器)反之亦然)。 错误消息«DLL找不到。»根本不存在…从来没有。
一些人认为静态链接作为玩具软件:错误! 我可以编写一个连接到DBMS(Oracle,SQL Server,…)或任何其他types应用程序的全function应用程序。