如果应用程序的某些库动态依赖于 msvcrt.dll,我是否应该将 msvcrt.dll 与我的应用程序一起重新分发并使用私有 dll? IE。系统的msvcrt.dll(dll hell)是否可能存在不兼容问题?应用程序针对 Windows Server 系统。
msvcrt - 是 Microsoft Visual C++ 运行时的动态库。
在 Windows 中使用 C 运行时有两种选择:
与静态运行时库的链接。
使用/MT
or the /MTd
cl.exe 的选项。在这种情况下,您将不依赖于 msvcrt DLL,因此无需重新分发它。在 Visual Studio 中,右键单击项目或解决方案,属性 > C/C++->代码生成->运行时库使用多线程 and 多线程调试分别。这是更简单的方法。缺点是生成的可执行文件较大。
与动态 C 运行时库的链接。
您将使用/MD
or the /MDd
cl.exe 的选项。
在 Visual Studio 中,右键单击项目或解决方案,属性 > C/C++->代码生成->运行时库使用多线程动态链接 and 多线程动态链接调试分别。这会产生更小的 EXE,但缺点是您在安装应用程序时必须安装所需的 MSVCRT。
每个版本的 VC++ 编译器都附带一个版本的 C 运行时 (CRT)。 Visual Studio 2005 附带了 v8 编译器和 v8 CRT。 v8 的实际 DLL 是 msvcrt80.dll。对于VS2008,它是v9,动态CRT是msvcrt90.dll。但是,CRT 的更新和修补比 C/C++ 编译器更频繁。开发人员可以下载更新的 CRT,并根据它进行构建。
如果使用动态 CRT 库进行编译,MUST从 microsoft.com 下载运行时所需版本的可再发行包,并在应用程序安装过程中执行(可能是静默)安装。
在 VS2005 之前,开发人员构建的应用程序依赖于 Windows 操作系统中的 MSVCRT。这将带来 DLL 的好处(小图像大小),同时不需要在应用程序安装中传送 CRT DLL。在Windoes 2000 之前,开发人员甚至会在\Windows 安装文件夹中安装新的MSVCRT.dll。但是,在许多应用程序和操作系统之间共享 CRT 被证明是一个非常糟糕的主意。在 WinXP SP2 中,Windows 附带的 CRT 发生了显着变化,任何依赖于该版本 CRT 的应用程序都面临着崩溃的风险。
此时,微软告诉开发人员,Windows 附带的 MSVCRT.dll 是操作系统的一部分,可以随时提供服务或修补。不支持针对它构建应用程序。因此应用程序应该使用上述方法之一。
参考:
-
MSDN 上的 VC++ 参考文档.
- 下载 MSVCRT90 v9.0.21022 (x86 VS2008) 的 redist
- 下载 MSVCRT90 v9.0.30729.4148 (x86 VS2008 SP1) 的 redist
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)