我应该使用我的应用程序重新分发msvcrt.dll并使用私有DLL,如果某些应用程序的lib动态依赖于msvcrt.dll?即系统的msvcrt.dll(dll hell)是否存在任何不兼容问题?应用程序针对Windows Server系统。
答案 0 :(得分:31)
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的应用程序都存在破坏的风险。
此时微软告诉开发人员,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)