为什么我的应用程序需要Visual C ++ Redistributable包

时间:2013-04-23 10:42:50

标签: visual-studio visual-c++ windows-runtime msvcrt redistributable

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

2 个答案:

答案 0 :(得分:53)

Microsoft提供的大多数32位Windows版本的C运行时库的版本为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.dllmsvcrt90.dllmsvcrt100.dllmsvcrt110.dllmsvcrt120.dllmsvcrt140.dll,这些都不是Windows附带的

解决方案:

  1. 可能的解决方案是静态链接运行时库,但如果您的应用程序中同时包含.exe.dll,则可能会导致很多问题。 不要那样做

    更具体地说,我允许自己引用this答案的一部分:

      

    如果您创建DLL和EXE,使用/ MT是有风险的。你最终会结束   在您的程序中使用CRT的多个副本。这尤其是一个   早期版本的VS存在问题,每个CRT都有自己的版本   堆,而不是VS2012。但是你仍然可以拥有丑陋的运行时   例如,如果您有多个“errno”变量,则会出现问题。   强烈建议使用/ MD以避免此类损失。

  2. 另一种可能的解决方案是要求在用户的计算机上安装适当的Microsoft Visual C ++ Redistributable软件包。

    可以通过在安装项目的先决条件属性中指定此要求来完成。

  3. 此外,您可以通过在设置项目中包含相应的“merge module”来分发运行时dll。在这种情况下,不要忘记添加适当的“策略合并模块”,以避免错误的运行时版本导致的错误。

  4. 最后,您可以将所需的DLL放在安装应用程序的同一文件夹中。

  5. 进一步阅读:

答案 1 :(得分:7)

即使有些评论说«静态链接运行时库,但是当你的应用程序中同时存在.exe和.dll时,它可能会导致很多问题。»这不是正确的。首先,我们不要静态链接DLL!我们静态链接OBJ和LIB。 LIB是静态库; DLL是动态库,您可以选择使用LIB(静态)或DLL(动态)。这完全取决于你选择。唯一的缺点(对于DLL粉丝)是,如果要更新一个库,则需要再次编译和链接。我亲自部署我的所有软件静态链接,因此我获得的奖金甚至不需要安装程序。我开发的软件是100%便携式(在安装前的时代是一般程序的功能),最终用户可以从一个文件夹到另一个文件夹,甚至从硬盘驱动器到闪存驱动器(或者反之亦然)。错误消息“找不到DLL。”根本就不存在......从来没有。

有些人认为静态链接为玩具软件:错误!我可以编写一个连接到DBMS(Oracle,SQL Server,...)或任何其他类型的应用程序的全功能应用程序。