如何在VC ++ 10.0中链接msvcrt.dll而不是msvcr100.dll?

时间:2012-04-15 21:44:59

标签: visual-c++

是否可以在VC ++ 10.0中链接VC6的MSVCRT.DLL?

默认情况下,它似乎与MSVCR100.DLL链接,但我不想重新分发另一个DLL(MSVCRT.DLL已经在我支持的每个操作系统中都可用)。

== EDIT ==

澄清一下:我的应用程序是一个进行WinAPI调用的纯C应用程序。我确实理解做C ++将需要C ++运行时,默认情况下它不捆绑在Windows中(并且最有可能必须匹配编译器)。我的问题是关于纯C的使用,以及我目标的最早版本的Windows中存在的CRT功能。

3 个答案:

答案 0 :(得分:10)

这不是VC6运行时。它是MSVCRT.DLL的系统副本,它与Windows而不是Visual Studio捆绑在一起。每个新版本的Windows都会获得一个新版本的MSVCRT.DLL,您可以通过检查文件大小来看到。

您可以使用Windows驱动程序工具包针对MSVCRT.DLL的系统副本进行编译。请注意,此DLL仅供“仅由系统级组件使用”。什么是系统级组件?好吧,一个司机。或者,例如,文本服务:

  

http://blogs.msdn.com/b/tsfaware/archive/2008/01/17/visual-studio-2008-issues.aspx

     

如果您正在构建文本服务DLL ...我建议安装   Vista(或XP)DDK并改为使用DDKWizard。 DDK来了   使用自己的C / C ++编译器,该编译器使用随附的C运行时库   使用操作系统(并且不会导致其他应用程序出现问题)......

更多信息:

  

http://kobyk.wordpress.com/2007/07/20/dynamically-linking-with-msvcrtdll-using-visual-c-2005/

     

出现了一个问题,微软做了什么?他们部署他们的   应用程序到各种Windows环境。看看Windbg的   依赖关系显示它使用MSVCRT.DLL而不是其中一个更新的   CRT显示器。微软的新网络监视器3.1也使用MSVCRT.DLL。   Windows桌面搜索也使用旧的,可靠的CRT。

     

所有这些新应用程序如何使用老式CRT?他们是   还没有使用古老的,不受支持的Visual C ++ 6.0,是吗?   好吧,不。答案更复杂,可以在   Windows驱动程序工具包(WDK)。

更新:Windows 8驱动程序工具包引入了一个新的基于MSBuild的构建系统,该系统不再链接到MSVCRT.DLL的系统副本。但是,使用Windows 7驱动程序工具包构建的二进制文件仍可在Windows 8和Windows 10上运行。

MSVCRT.DLL仍附带Windows 10以实现向后兼容性,因此它的文件版本为7.0。#####。仍在积极开发的组件(如user32.dll)的文件版本为10.0。#####。

答案 1 :(得分:6)

平均“Petzold风格”的Win32程序只需要msvcrt.dll中的一些功能。在我的例子中,我经常需要浮点格式化例程,如_sntprintf()。并且这些功能的功能不太可能发生变化。出于这个原因,我创建了一个“msvcrt-light.lib”导入库,作为我在MSVC项目中包含的标准库的替代品。 (http://www.tu-chemnitz.de/~heha/hs/msvcrt-light.zip/

对于成熟的C ++程序,msvcrt-light.lib可能根本不适合。如上所述使用DDK。

答案 2 :(得分:0)

这要求主要编译器版本之间的CRT兼容性,Microsoft试图容纳(例如,将VC5堆添加到VC6SP2运行时)但最终放弃并引入了当前使用的msvcrxx.dll。如果您查看CRT源代码,您会发现很多#ifndef _SYSCRT,这就是Microsoft的msvcrt.dll与生成代码时编译器使用的msvcrt.dll之间的区别。

几年前,微软的Raymond Chen就此发表了博客。 来自他的博客Windows is not a Microsoft Visual C/C++ Run-Time delivery channel

  

与所有版本的Visual C ++兼容的DLL是一个维护噩梦   ...   在某些时候,决定放弃并宣布它   操作系统DLL,仅由操作系统组件使用

强调我的。再想一想,将支持的文件添加到安装程序或链接静态版本的CRT是否很困难,而不是依赖于Microsoft 十多年前放弃编译器兼容性的系统组件

令人惊讶的是,有多少人仍在否认这一决定。这些人造成了"a lot of grief for the Visual C++ product team",如果你一直在惹恼他们,如果他们有时像what they did in Windows XP那样惹恼了你,那么我会不会感到惊讶。很多人没有遵循Windows 2000应用程序开发人员指南,并将设置/游戏保存放在Program Files文件夹中。我们都知道Windows Vista发布时的好结局。

顺便说一句dll不是VC6的。在系统中使用旧的dll会自动失败Microsoft的安全开发生命周期。 (https://blogs.msdn.microsoft.com/oldnewthing/20100607-00/?p=13793/#10020962)。你没有真实地期望微软使用VC6来编译它的现代产品,对吗?

现代版Windows中的msvcrt版本从未在相应版本的Windows SDK中提及过。无论您使用何种编译器版本或CRT lib版本,它都很可能与您客户机器上的大多数DLL版本不匹配。 Microsoft使用可能会或可能不会公开的当前工具链更新CRT DLL(例如,当releasing a Windows Media Player patch时)。您可以指望它们使用古老的WDK编译器和库在Windows中构建msvcrt DLL(为什么古老?因为the WDK team does not like people use their compiler to link against msvcrt either, and removed the loophole in version 8.0 to stop those "clever" people)。

相关问题