我应该用我的应用程序重新分发msvcrt.dll吗?

时间:2009-07-02 09:53:03

标签: windows deployment dll msvcrt

我应该使用我的应用程序重新分发msvcrt.dll并使用私有DLL,如果某些应用程序的lib动态依赖于msvcrt.dll?即系统的msvcrt.dll(dll hell)是否存在任何不兼容问题?应用程序针对Windows Server系统。

4 个答案:

答案 0 :(得分:31)

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

在Windows中使用C运行时有两种选择:

  1. 与静态运行时库链接。
    使用cl.exe的/MT/MTd选项。在这种情况下,您将不依赖于msvcrt DLL,因此您不必重新分发它。在Visual Studio中,右键单击项目或解决方案,属性> C / C ++ - >代码生成 - >运行时库分别使用多线程多线程调试。这是更简单的方法。缺点是生成的可执行文件更大。

  2. 与动态C运行时库链接。
    您将使用cl.exe的/MD/MDd选项 在Visual Studio中,右键单击项目或解决方案,属性> C / C ++ - >代码生成 - >运行时库分别使用多线程动态链接多线程动态链接调试。这会导致较小的EXE,但缺点是您必须在安装应用程序时安装所需的MSVCRT。


  3. 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的应用程序都存在破坏的风险。

    此时微软告诉开发人员,Windows附带的MSVCRT.dll是操作系统的一部分,可以随时进行维修或修补。不支持构建针对它的应用程序。因此,应用程序应使用上述方法之一。

    参考文献:

答案 1 :(得分:24)

必须将msvcrt与您的应用程序一起发送。它不是操作系统的保证部分。如果特定版本的Windows 发生以获得它,那只是因为Windows中的某些东西正在使用它。

当较新版本的Windows没有发生以包含人们认为Windows附带的二进制文件时,应用程序已经崩溃。当用户选择不安装WinFax时,应用程序已经崩溃,这意味着没有安装msvcrt。

来自Raymond Chen

  

取决于Windows的版本   你在跑步,可能会有各种各样的   支持DLL的事情不是   正式的产品组件,但其中   仅仅是为了骑行。

     

...

     

今天这个问题仍然存在。人们走了   在二进制文件周围徘徊   随Windows寻找   他们可以remora。然后   他们对那些二进制文件感到惊讶   完全改变或消失。

来自KB326922 - Redistribution of the shared C runtime component in Visual C++

  

...不再考虑CRT DLL   因此,系统文件分发   任何应用程序的CRT DLL   依靠它。因为它不再存在   一个系统组件,安装在你的   应用程序Program Files目录   与其他特定于应用程序的代码。   这会阻止您的申请   使用其他版本的CRT   可以安装在库上的库   系统路径。

必须将msvcrt与您的应用程序一起发送,如果您链接到MSVCRT

更多

  

决定放弃并声明它是一个操作系统DLL,只能由操作系统组件使用。

     

虽然MSVCRT.DLL很长时间以来一直是操作系统DLL and has been documented as off-limits to applications,但仍有a lot of people treat it as a C runtime delivery channel人,这些程序会造成很大的悲痛。产品团队。

必须使用您的应用程序重新分发Microsoft Visual C运行时,因为Windows不附带任何Microsoft Visual C运行时。可能发生是一个名为msvcrt.dll的DLL(不保证),它不是 MSVCRT。

答案 2 :(得分:12)

克里斯的答案不应该被否决,因为两者都是正确的。

问题是有两套不同的MSVCRT。一套是Visual Studio附带的msvcrt80.dll,msvcrt90.dll等。这是人们通常使用的。他们必须重新分配,正如其他答案中所说的那样。

另一个是System32文件夹中的msvcrt.dll(文件名中没有数字),该文件仅供操作系统本身使用。应用程序永远不应该替换/重新安装它。但是,某些应用程序会链接到它,出于某些原因,例如删除要安装的额外依赖项。但请注意,不能保证在将来的Windows版本中可用。

答案 3 :(得分:5)

msvcrt.dll已成为操作系统发行版的真实部分。在Windows 98和95以及可能的NT4上,可以在没有它的情况下安装操作系统,如果有人去除安装后的WordPad等应用程序。

然而,鉴于其无处不在,以及由于这些操作系统很少有应用程序开发人员费心去发货,至少自从Windows 2000以来它一直是操作系统的官方部分。

Microsoft支持有tool,您可以使用它来仔细检查DLL随附的产品。

执行this之类的搜索,您可以看到msvcrt.dll vsrsion 7.0.3790.0是Windows server 2003发行版的一部分。