为什么我的应用程序需要Visual C ++可再发行组件包

我正在Visual Studio中编写一个简单的C++应用程序。 它也有一个设置项目。 它在我的开发机器上运行良好,但是当我在用户的机器上安装这个应用程序时,它需要Visual C++ Redistributable Package 。 我想知道为什么我的应用程序需要C++ Redistributable ? 标准C++运行时库随Windows一起提供,不是吗?

由微软提供的大多数32位Windows版本的C runtime库的唯一版本是msvcrt.dll 。 该库提供了CC++程序所需的典型库函数集。 这些包括string manipulationmemory allocationC-style input/output calls等。
Visual Studio 6.0的编译器链接到这个库,所以如果你在VS 6.0中开发,你不应该在大多数用户的机器上发现任何问题。
但是,如果您正在开发VS 2005VS 2008VS 2010VS 2012VS 2013VS 2015 ,则必须随附您的应用程序分发更多的C runtime库。 这是因为它们的编译器分别链接到msvcrt80.dllmsvcrt90.dllmsvcrt100.dllmsvcrt110.dllmsvcrt120.dllmsvcrt140.dll ,它们不随窗口一起提供。

解决scheme:

  1. 可能的解决scheme是静态链接到运行时库,但是当您的应用程序中同时包含.exe.dll时,可能会导致很多问题。 不要这样做
    更具体地说,我会让自己引用这个答案的一部分:

    如果你创buildDLL和EXE,使用/ MT是有风险的。 你的程序中会有多个CRT副本。 对VS的早期版本来说,这尤其是一个问题,每个CRT都会有自己的堆,而VS2012则没有这么多。 但是当你有多个“errno”variables时,你仍然可能会遇到难看的运行时问题。 强烈build议使用/ MD来避免这种损失。

  2. 另一种可能的解决scheme是要求在用户的计算机上安装适当的Microsoft Visual C++ Redistributable软件包。
    可以通过在安装项目中的先决条件属性中指定此要求来完成。

  3. 此外,您可以通过在您的安装项目中包含适当的merge module来分发运行时dll 。 在这种情况下,不要忘记添加适当的policy merge module以避免由不正确的运行时版本引起的错误。
  4. 最后,您可以将所需的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应用程序。