7

MS Visual C++ 运行时库中有什么?我的意思是,我用谷歌搜索了它,我总是找到诸如帮助之类的东西,app xxxx 给了我 MS Visual C++ 运行时库错误,没有任何解释。

我以为 Windows C 运行时库随 Windows 一起提供?不使用 VC++?谢谢。

编辑:首先,感谢您的回答。我现在对 Windows 中的运行时库有一个坏主意。我的意思是,第一部分,Windows 内部有它的 win32 API,所以,没关系,我知道。此外,Win32API 来自内核和用户部分。

但我一直认为像 GDI 这样的函数是作为 DLL 访问的(我仍然相信它们是)。但我认为甚至printf在某些 Windows 文件中也有类似的功能。

所以,我是对的,当我知道“简单”函数printf需要直接链接而不是直接使用操作系统的内核部分,更复杂的 Windows API 函数作为 dll 链接时,因此不与编译器一起分发,但是与操作系统?他们随后访问内核?

我的意思是,让我们说 GDI,我告诉它画图,它在用户模式下完成所有艰苦的工作,而不是调用将所有内容放入帧缓冲区的内核函数?

最后一个想法,为什么这甚至是这样解决的?我的意思是,如果 VC++ 运行时只是 C 和 WinAPI 之间的层,为什么 VC++ 不能直接调用 WinAPI?

4

4 回答 4

6

这是一个过度简化,但它会给你要点。MSVCRT 是一组实现部分 C++ 语言的 DLL。在这些 DLL 中实现了 等printf函数。memcpy

使用特定编译器编译并动态链接到 C++ 运行时的每个程序都必须以某种方式在目标计算机上具有正确版本的 CRT 二进制文件。因此,交付给最终用户的应用程序通常(通常?)也带有这些 DLL 的包。这个包被称为“可再发行”(或“redist”),每个精确的编译器版本和目标平台的组合都有一个不同的包。例如,以下每个都有单独且不同的重新分配:

  • MSVC 10、64 位窗口
  • MSVC 10、32 位窗口
  • MSVC9,64 位窗口
  • MSVC9 SP1,64 位窗口

等等。

是的,Windows 通常“附带”某些版本的 CRT。但是,它附带了运行 Windows 附带的应用程序所需的版本。如果 Windows 及其所有应用程序是在 MSVC8 SP2 中编译的,而您的应用程序是在 MSVC10 中编译的,那么需要的 CRT 将不会出现在盒子上,因为它运行的是 Windows。

这就是为什么将应用程序与 redist 一起发布的常见做法。

编辑:

通过胡迪尼之类的魔术,我预测您的下一个问题将是“我从哪里获得红人?”

答案是,来自微软。尝试谷歌搜索“msvc 9 x64 redist”,你会发现:

http://www.microsoft.com/downloads/en/details.aspx?familyid=bd2a6171-e2d6-4230-b809-9a8d7548c1b6&displaylang=en

于 2010-11-17T22:29:56.570 回答
2

一个简短的回答是 MSVS C/C++ 运行时实现了诸如 malloc/free、stdio、iostream 之类的函数以及一些诸如 dynamic_cast 和异常处理之类的 c++ 东西。这些在 Visual Studio 的版本之间有所不同,因此不同版本有不同的运行时。

Windows 主要附带一个 C API(Win32 API),它与 C/C++ 标准库有很大不同。MSVS C/C++ 运行时调用此 API 以分配内存等。

(我认为 Windows 中包含的一些应用程序是用 MSVS 和 C++ 编写的,因此它们确实包含该版本的 MSVS 运行时。)

此外,随着新 Visual Studio 版本的发布,运行时也会发生变化。Windows 版本的持续时间要长得多。

于 2010-11-17T22:24:27.973 回答
2

用 Visual C++ 编译的程序需要一个“运行时”——这是一段处理应用程序启动/关闭、内存分配/释放、支持读取和写入文件等的代码。

这不是操作系统的一部分,也不是最终应用程序的一部分 - 因为所有 C++ 应用程序都可以共享它,所以默认情况下运行时是单独安装的。

此外,每个版本的 Visual C++ 都有自己的运行时安装程序,因为每个版本都有细微的差异和所有这些工作方式的改进。对于不同的平台(例如 x86 和 x64),运行时也有不同的版本

因此,Microsoft 提供了许多“Visual Studio XXXX 运行时安装程序 (YYY)”下载,其中 XXXX 是 Visual Studio 版本(2005、2008、2010 等),而 YYY 通常是“x86”或“x64” ”。

大多数需要运行时的应用程序会在需要时自动安装它,因此最终用户通常不太了解这些可再发行组件。

于 2010-11-17T22:25:53.323 回答
2

它们是实现 C 和 C++ 标准库函数的库。printf在这些库中实现的标准功能。

核心 Windows 库仅提供系统调用接口,即Win32 API,因为这是构建功能齐全的 Windows 应用程序所需的全部。VC++ 库大多是围绕这个 API 的包装器,类似于glibcLinux 上的库。

例如,malloc来自 C 库的可能反过来使用VirtualAllocAPI 来分配内存。

于 2010-11-17T22:26:18.133 回答