48

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

4

2 回答 2

58

微软随大多数 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.dllmsvcrt140.dll,这些都没有随 Windows 一起提供。

解决方案:

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

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

    如果您创建 DLL 和 EXE,则使用 /MT 是有风险的。您最终会在程序中获得多个 CRT 副本。这对于早期版本的 VS 尤其是一个问题,其中每个 CRT 都有自己的堆,而 VS2012 则不然。但是,例如,当您有多个“errno”变量时,您仍然会遇到难看的运行时问题。强烈建议使用 /MD 以避免此类损失。

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

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

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

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

进一步阅读:

于 2013-04-23T10:42:49.910 回答
9

尽管有些评论说«与运行时库静态链接,但是当您的应用程序中同时包含 .exe 和 .dll 时,它可能会导致很多问题。» 这不是真的。首先,我们不静态链接 DLL!我们静态链接 OBJ 和 LIB。LIB 是静态库;DLL 是动态库,您可以选择使用 LIB(静态)或 DLL(动态)。这完全取决于您的选择。唯一的缺点(对于 DLL 爱好者)是如果你想更新一个库,你需要重新编译和链接。我个人部署了我所有的静态链接软件,因此我获得了甚至不需要安装程序的奖励。我开发的软件是 100% 可移植的(在预安装器时代是通用程序的功能),最终用户可以自由地从一个文件夹简单地复制到另一个文件夹,甚至从硬盘驱动器复制到闪存驱动器(反之亦然)。错误信息 «DLL not found.» 根本不存在……从不。

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

于 2014-12-19T09:50:55.217 回答