我正在Visual Studio中编写一个简单的C++
应用程序。它还有一个安装项目。
它在我的开发机器上运行良好,但是当我在用户的机器上安装此应用程序时,它需要Visual C++ Redistributable Package
。我想知道为什么我的应用程序需要C++ Redistributable
? Windows附带标准C++
运行时库,不是吗?
答案 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.dll
,msvcrt90.dll
,msvcrt100.dll
,msvcrt110.dll
,msvcrt120.dll
和msvcrt140.dll
,这些都不是Windows附带的
可能的解决方案是静态链接运行时库,但如果您的应用程序中同时包含.exe
和.dll
,则可能会导致很多问题。 不要那样做。
更具体地说,我允许自己引用this答案的一部分:
如果您创建DLL和EXE,使用/ MT是有风险的。你最终会结束 在您的程序中使用CRT的多个副本。这尤其是一个 早期版本的VS存在问题,每个CRT都有自己的版本 堆,而不是VS2012。但是你仍然可以拥有丑陋的运行时 例如,如果您有多个“errno”变量,则会出现问题。 强烈建议使用/ MD以避免此类损失。
另一种可能的解决方案是要求在用户的计算机上安装适当的Microsoft Visual C ++ Redistributable软件包。
可以通过在安装项目的先决条件属性中指定此要求来完成。
此外,您可以通过在设置项目中包含相应的“merge module”来分发运行时dll
。在这种情况下,不要忘记添加适当的“策略合并模块”,以避免错误的运行时版本导致的错误。
最后,您可以将所需的DLL放在安装应用程序的同一文件夹中。
答案 1 :(得分:7)
即使有些评论说«静态链接运行时库,但是当你的应用程序中同时存在.exe和.dll时,它可能会导致很多问题。»这不是正确的。首先,我们不要静态链接DLL!我们静态链接OBJ和LIB。 LIB是静态库; DLL是动态库,您可以选择使用LIB(静态)或DLL(动态)。这完全取决于你选择。唯一的缺点(对于DLL粉丝)是,如果要更新一个库,则需要再次编译和链接。我亲自部署我的所有软件静态链接,因此我获得的奖金甚至不需要安装程序。我开发的软件是100%便携式(在安装前的时代是一般程序的功能),最终用户可以从一个文件夹到另一个文件夹,甚至从硬盘驱动器到闪存驱动器(或者反之亦然)。错误消息“找不到DLL。”根本就不存在......从来没有。
有些人认为静态链接为玩具软件:错误!我可以编写一个连接到DBMS(Oracle,SQL Server,...)或任何其他类型的应用程序的全功能应用程序。