我应该将msvcrt.dll与我的应用程序一起重新分发,并在某些应用程序的库动态依赖于msvcrt.dll时使用私有dll吗?也就是说,系统的msvcrt.dll是否可能存在任何不兼容问题(dll hell)?应用程序的目标是Windows Server系统。
我应该将msvcrt.dll与我的应用程序一起重新分发,并在某些应用程序的库动态依赖于msvcrt.dll时使用私有dll吗?也就是说,系统的msvcrt.dll是否可能存在任何不兼容问题(dll hell)?应用程序的目标是Windows Server系统。
msvcrt是用于Microsoft Visual C++运行时的动态库。
在Windows中,有两种使用C运行时的选项:
链接静态运行时库。
使用/MT
或/MTd
选项来调用cl.exe。在这种情况下,您不会依赖于msvcrt DLL,因此您无需重新分发它。在Visual Studio中,右键单击项目或解决方案,属性> C/C++>代码生成>运行时库使用多线程和多线程调试。这是更简单的方法。缺点是生成的可执行文件较大。
链接动态C运行时库。
您将使用/MD
或/MDd
选项来调用cl.exe。
在Visual Studio中,右键单击项目或解决方案,属性> C/C++>代码生成>运行时库使用多线程动态链接和多线程动态链接调试。这会导致较小的EXE,但缺点是必须在安装应用程序时安装所需的MSVCRT。
来自KB326922 - Visual C++中共享C运行时组件的重新分配:根据您运行的Windows版本,可能会有各种支持DLL,用于处理非正式产品组件,但仅是随行而至。
...
这个问题今天仍然存在。人们在Windows附带的二进制文件中四处搜寻他们可以remora的东西。然后当这些二进制文件发生变化或完全消失时,他们会感到惊讶。
更多信息:
决定只是放弃并将其声明为操作系统DLL,仅供操作系统组件使用。
尽管MSVCRT.DLL长期以来一直是操作系统DLL,并已记录为禁止应用程序使用,但仍有很多人将其视为C运行时交付通道,这些程序为产品团队带来了很多麻烦。和已记录为禁止应用程序使用 很多人 将其视为C运行时交付通道。"
你需要在应用程序中重新分发 Microsoft Visual C 运行时,因为 Windows 没有提供任何 Microsoft Visual C 运行时。可能会出现一个名为“msvcrt.dll”的 DLL(不保证),但它不是 MSVCRT。请注意,这段话中的、和标签都要保留。
msvcrt.dll
混淆。如果您的应用程序依赖于 MSVCRT,则需要重新分发与您所建立的 Microsoft Visual C++ 运行时库相对应的版本 - 它永远不会是 msvcrt.dll
(因为那是一个私有 dll,您永远无法链接)。 - Ian Boydmsvcrt.dll
- 它们不应该,但它们确实这样做。我的担忧是人们会认为你说的是msvcrt.dll
,当你说msvcrt时。也许你可以把它写清楚 - 用“Microsoft C runtime”代替“msvcrt”?并澄清即使你链接到它,也不能发布msvcrt.dll
? - Harry JohnstonChris的回答不应该被投票否定,因为两种方法都是正确的。
问题在于有两套不同的MSVCRTs。一套是msvcrt80.dll, msvcrt90.dll等与Visual Studio一起提供的,这是人们通常使用的。并且它们必须要被重新分发,就像其他答案中所说的那样。
另一套是System32文件夹中的msvcrt.dll(文件名中没有数字),旨在仅由操作系统自身使用。应用程序不应该替换/重新安装它。但是,一些应用程序确实会链接到它,出于某些原因,例如删除额外的依赖项以进行安装。但请注意,在未来的Windows版本中不能保证其可用性。
msvcrt.dll
将继续作为Windows的一部分存在。 - Harry Johnston