MS Visual C++运行库 - 有什么用途?

8
MS Visual C++运行库里面有什么?我的意思是,我在谷歌上搜到的结果总是像“帮助,应用程序xxxx给了我MS Visual C++运行库错误”这样的东西,没有解释。
我以为Windows C运行库是自带的?不是VC++自带的吗?谢谢。
编辑: 首先,感谢回答。我现在对Windows中的运行库有了一个错误的认识。我的意思是,第一部分,Windows内部有其win32 API等,这没问题,我知道。另外,Win32API来自内核和用户部分。
但我一直认为像GDI这样的函数是通过DLL访问的(我仍然相信它们是)。但我甚至认为像printf这样的函数也在某个Windows文件中。
所以,当我现在知道像printf这样的“简单”函数需要直接链接,然后直接使用操作系统的内核部分,而更复杂的Windows API函数则链接为dll,因此不是由编译器分发而是由操作系统分发时,我是对的吗?他们随后访问内核?
我的意思是,比如说GDI,我告诉它画图,它在用户模式下完成所有艰苦的工作,然后调用内核函数将所有内容放入帧缓冲区?
最后一个想法,为什么要这样解决?我的意思是,如果VC++运行库只是C和WinAPI之间的层,为什么不能直接调用WinAPI?
4个回答

8
这只是一个简化版,但是可以让你了解大致情况。MSVCRT是一组实现C++语言部分功能的DLL。像printf、memcpy等函数都在这些DLL中实现。
每个使用特定编译器编译并与C++运行时动态链接的程序,在目标计算机上都必须有正确版本的CRT二进制文件。因此,发送给最终用户的应用程序通常(通常?)也会附带这些DLL的包。这个包被称为“可再发行”(或“redist”),每个确切的编译器版本和目标平台都有不同的包。例如,对于以下每个内容都不同的内容,都有单独的redist:
MSVC 10,64位Windows
MSVC 10,32位Windows
MSVC9,64位Windows
MSVC9 SP1,64位Windows
等等。
是的,Windows通常会“附带”某个版本的CRT。但是,它附带的是为了运行随Windows一起提供的应用程序所需的版本。如果Windows及其所有应用程序都是使用MSVC8 SP2编译的,而您的应用程序是使用MSVC10编译的,则您需要的CRT在计算机上不存在,仅仅因为它正在运行Windows。

这就是为什么通常会将应用程序与redists一起发布的原因。

编辑:

通过像Houdini一样的魔法,我预测你下一个问题将是“我从哪里获取redists?”

答案是,从微软。尝试搜索“msvc 9 x64 redist”,您将找到:

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


4
简而言之,MSVS C/C++运行时实现了像malloc/free、stdio、iostream以及一些C++相关的内容如dynamic_cast和异常处理等函数。这些函数在不同版本的Visual Studio中略有不同,因此会存在不同版本的运行时。
Windows主要提供C API(Win32 API),该API与C/C++标准库非常不同。MSVS C/C++运行时调用这个API来分配内存等操作。
(我猜测Windows包含的一些应用是使用MSVS和C++编写的,因此它们包含该版本的MSVS运行时。)
此外,随着新的Visual Studio版本发布,运行时也会发生变化。一个Windows版本的发布时间远比那要长。

那么,我理解的是Visual C++运行时包括一个C++标准库的实现,该实现在运行时链接(以防您不想在编译时链接到C++标准库)?而据我所知,它可能包括非标准的Microsoft添加内容?微调? - Vimes
@JohnB:在简单的情况下(单个exe等),您可以静态链接到它。它可能包含MSFT特定的内容,但首先和最重要的是它包含了Microsoft的C++ stdlib和其他C/C++运行时部分的预编译部分(malloc/free、全局new/delete、memcpy、RTTI等)。如果您查看其他编译器,它们也有自己的运行时,其中一些库需要以某种方式链接进来。 - Macke

3
使用Visual C++编译的程序需要“运行时”-这是一段处理应用程序启动/关闭、内存分配/释放、读写文件支持等功能的代码。
这不是操作系统的一部分,也不是最终应用程序的一部分 - 因为所有C++应用程序都可以共享它,默认情况下运行时是单独安装的。
此外,每个Visual C++版本都有自己的运行时安装程序,因为随着每个版本中所有这些工作方式的轻微差异和改进。还有不同平台(例如x86和x64)的运行时的不同版本。
因此,Microsoft提供了许多“Visual Studio XXXX runtime installer (YYY)”下载,其中XXXX是Visual Studio版本(2005、2008、2010等),YYY通常是“x86”或“x64”。
大多数需要运行时的应用程序会在需要时自动安装它,因此一般用户很少注意到这些可再发行组件。

如果您在Visual Studio中选择了正确的选项,它可以成为最终应用程序的一部分,但通常情况下不是这样的,您是正确的。 - Tobias Langner

3
它们是实现C和C++标准库函数的库。这些库实现了诸如printf等标准函数。
核心Windows库仅提供与系统调用(即Win32 API)的接口,因为这就足以构建功能齐全的Windows应用程序。VC++库大多是这个API的包装器,类似于Linux上的glibc库。
例如,C库中的malloc可能会使用VirtualAlloc API来分配内存。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接