如果某些应用程序的库动态依赖于msvcrt.dll,我是否应该随应用程序重新分发msvcrt.dll并使用私有(private)dll? IE。 msvcrt.dll(dll hell )可能引起任何不兼容问题吗?该应用程序针对Windows Server系统。

最佳答案

msvcrt-是Microsoft Visual C++运行时的动态库。

在Windows中使用C运行时有两个选项:

带有静态运行时库的

  • 链接。
    对cl.exe使用/MT/MTd选项。在这种情况下,您将不依赖于msvcrt DLL,因此不必重新分发它。在Visual Studio中,右键单击“项目”或“解决方案”,然后依次单击“属性”>“C/C++”->“代码生成”->“运行时库”,分别使用“多线程调试”和“多线程调试”。这是更简单的方法。缺点是生成的可执行文件更大。
  • 与动态C运行时库的
  • 链接。
    您将对cl.exe使用/MD/MDd选项。
    在Visual Studio中,右键单击“项目”或“解决方案”,然后依次单击“属性”>“C/C++”->“代码生成”->“运行时库”,分别使用“多线程动态链接”和“多线程动态链接”调试。这将导致EXE较小,但缺点是在安装应用程序时必须安装所需的MSVCRT。


  • VC++编译器的每个发行版均附带一个版本的C运行时(CRT)。 Visual Studio 2005随编译器的v8和CRT的v8一起提供。 v8的实际DLL是msvcrt80.dll。对于VS2008,它是v9,动态CRT是msvcrt90.dll。但是,CRT的更新和修补比C/C++编译器更频繁。开发人员可以下载更新的CRT,并以此为基础进行构建。

    如果使用动态CRT库进行编译,则务必从microsoft.com下载运行时必需版本的可重新分发程序包,并在安装应用程序时对其进行安装(可能是静默安装)。

    在VS2005之前,开发人员构建的应用程序依赖于Windows操作系统中的MSVCRT。这将带来DLL的好处(较小的图像大小),而无需在应用程序安装中附带运送CRT DLL的要求。在Windoes 2000之前,开发人员甚至可以在\Windows安装文件夹中安装新的MSVCRT.dll。但是,在许多应用程序和操作系统之间共享CRT也是一个非常糟糕的主意。使用WinXP SP2,Windows附带的CRT发生了重大变化,任何依赖于该CRT版本的应用程序都有被破坏的风险。

    此时,Microsoft告诉开发人员Windows附带的MSVCRT.dll是OS的一部分,可以随时进行服务或打补丁。不支持针对它构建应用程序。因此,应用程序应使用上述方法之一。

    引用:
  • the VC++ reference documentation on MSDN
  • download for the redist of MSVCRT90 v9.0.21022 (x86 VS2008)
  • download for the redist of MSVCRT90 v9.0.30729.4148 (x86 VS2008 SP1)
  • 关于windows - 我应该在应用程序中重新分发msvcrt.dll吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1073509/

    10-08 21:14