代码之家  ›  专栏  ›  技术社区  ›  B.Gen.Jack.O.Neill

MS VisualC++运行库-什么?

  •  6
  • B.Gen.Jack.O.Neill  · 技术社区  · 14 年前

    MS VisualC++运行库中的内容是什么?我的意思是,我Google它,我总是发现像帮助的东西,app XXXX给我MS VisualC++运行库错误,没有解释。

    我以为Windows C runtime库和Windows一起提供?不使用VC++?谢谢。

    编辑: 首先,谢谢你的回答。我觉得现在我对windows中的运行库有了不好的想法。我是说,第一部分,Windows内部有它的win32 API,所以,没关系,我知道。另外,Win32API来自内核和用户部分。

    但我一直认为像GDI这样的函数是作为DLL访问的(我仍然相信它们是DLL)。但我想即使功能像 printf 在一些windows文件中也是如此。

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

    我的意思是,比方说GDI,我告诉它画图,它让所有的工作都在用户模式下进行,而不是调用内核函数,把它放在帧缓冲区?

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

    4 回复  |  直到 11 年前
        1
  •  2
  •   Macke    11 年前

    一个简短的答案是,MSVS C/C++运行时实现了诸如MalC/Cype、STDIO、IoSoW之类的功能,以及一些类似C++的东西,如DyrimeSkyCube和异常处理。这在visual studio的不同版本之间是不同的,因此不同版本有不同的运行时。

    Windows主要使用C API(Win32 API),它与C/C++标准库有很大的不同。MSVC/C/C++运行时调用这个API来分配内存等。

    (我想Windows中的一些应用程序是用MSV和C++编写的,所以它们确实包含了那个版本的MSVS运行时。)

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

        2
  •  6
  •   John Dibling    14 年前

    这是一个过于简单化的说法,但它会给你提供要点。是一组实现C++语言部分的DLL。功能如下 printf , memcpy 在这些dll中实现了类似的功能。

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

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

    等等。

    是的,Windows通常会“附带”一些CRT版本。但是,它附带了运行Windows附带的应用程序所需的版本。如果Windows及其所有应用程序都是在MSVC8 SP2中编译的,而您的应用程序是在MSVC10中编译的,则CRT require不会仅仅因为运行Windows而出现在框中。

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

    编辑:

    通过胡迪尼喜欢的魔术,我预测你的下一个问题将是“我在哪里得到的重新发现?”

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

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

        3
  •  2
  •   casablanca    14 年前

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

    核心Windows库只提供系统调用的接口,即 Win32 API ,因为这就是构建功能齐全的Windows应用程序所需的全部内容。VC++库主要是这个API周围的包装,类似于 glibc Linux上的库。

    举个例子, malloc 从C库中可以依次使用 VirtualAlloc 分配内存的API。

        4
  •  2
  •   Jason Williams    14 年前

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

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

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

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

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