【问题标题】:MS Visual C++ runtime library - what for?MS Visual C++ 运行时库 - 有什么用?
【发布时间】:2011-05-11 17:09:56
【问题描述】:

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++ runtime 只是 C 和 WinAPI 之间的一层,为什么 VC++ 不能直接调用 WinAPI?

【问题讨论】:

    标签: c++ msvcrt


    【解决方案1】:

    这是一种过于简单化的方法,但它会为您提供要点。 MSVCRT 是一组实现部分 C++ 语言的 DLL。 printfmemcpy 等函数在这些 DLL 中实现。

    使用特定编译器编译并动态链接到 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 一起发布的常见做法。

    编辑:

    通过 Houdini 之类的魔法,我预测您的下一个问题将是“我在哪里可以得到 redists?”

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

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

    【讨论】:

      【解决方案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 版本的持续时间要长得多。

      【讨论】:

      • 那么,我是否有权让 Visual C++ 运行时包含在运行时链接的 C++ 标准库的实现(如果您不想在编译时链接到 C++ 标准库)时间)?据我所知,它可能包括非标准的微软添加?调整?
      • @JohnB:您可以在简单的情况下(单个 exe 等)静态链接到它。它可能包括特定于 MSFT 的内容,但首先它包含 Microsoft 的 c++ stdlib 的预编译部分和其他 C/C++ 运行时内容(malloc/free、global new/delete、memcpy、RTTI 等)。如果您查看其他编译器,它们也有自己的运行时,其中一些库需要以一种或另一种方式链接。
      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

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

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

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

        【讨论】:

        • 如果您在 Visual Studio 中选择正确的选项,它可以成为最终应用程序的一部分 - 但一般情况下它不是,您是对的。
        猜你喜欢
        • 2011-02-15
        • 2016-04-16
        • 2020-08-13
        • 1970-01-01
        • 1970-01-01
        • 2011-01-09
        • 2012-01-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多