我正在写一个简单的C++
在Visual Studio应用程序。 它也有一个安装项目。 它运作良好,我的机器上,但是当我在用户的计算机上安装该应用程序它需要Visual C++ Redistributable Package
。 我想知道为什么我的应用程序需要C++ Redistributable
? 标准C++
运行时库随Windows,是不是?
Answer 1:
这是由微软发布与大多数的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年或2015年VS,你必须与你的应用程序一起分发额外的C运行时库。 这是因为他们对编译器链接msvcrt80.dll
, msvcrt90.dll
, msvcrt100.dll
, msvcrt110.dll
, msvcrt120.dll
和msvcrt140.dll
分别,这是与Windows不发货。
解决方案:
可能的解决方案是用运行时库静态链接,但它可能会导致很多问题的情况下,你同时拥有
.exe
和.dll
在您的应用程序。 不要那样做 。更具体地讲,我会让自己引用的一部分, 这个答案:
如果你创建的DLL以及一个EXE使用/ MT是有风险的。 你会在你的程序中的CRT的多个副本结束。 这尤其是与早期版本的VS,其中每个CRT会得到自己的堆,与其说与VS2012的一个问题。 但是,你仍然可以有丑陋的运行问题,当你有一个以上的“错误号”,例如变量。 使用/强烈推荐MD避免这种lossage。
另一种可能的解决方案是需要适当的的Microsoft Visual C ++可再发行要在用户的计算机上安装的程序包。
它可以通过安装项目中指定的先决条件中财产这个要求来完成。
此外,您还可以分发运行时
dll
包含在您安装项目相应的“ 合并模块 ”。 在这种情况下,不要忘记添加相应的“政策合并模块”,以避免因不正确运行时版本错误。最后,你可以把所需的DLL在其中安装了应用程序相同的文件夹。
延伸阅读:
- “ 重新发布的Visual C ++文件 ” -官方MSDN文档
Answer 2:
尽管一些评论说,«链接静态与运行时库,但是当你在你的应用程序都.exe和.dll可能会导致很多问题。»这是不正确的。 首先,我们不要静态链接的DLL! 我们静态链接OBJ文件和库。 库是静态库; DLL是动态库,你可以选择使用LIBS(静态)或DLL(动态)。 这完全由你来选择。 唯一的缺点(对于DLL球迷)是,如果你想更新一个库,你需要编译和重新关联。 我亲自部署所有我的软件静态链接正因为如此我赚的,甚至不需要安装奖金。 我开发的软件是100%的便携式(一种功能,在安装前的时代是通用程序),并且最终用户可以自由地简单复制从一个文件夹到另一个,甚至从硬盘到闪存驱动器(或副反之亦然)。 该错误消息«DLL找不到。»根本不存在...从来没有。
有些人认为的静态链接的玩具软件:错! 我可以写一个连接到一个数据库管理系统(甲骨文,SQL服务器,...)或任何其他类型的应用程序的一个全功能的应用程序。