`

vc运行时库

阅读更多

一、历史

  C运行时库就是C run-time library,诞生于20世纪70年代,是C而非C++语言世界的概念,C程序运行时需要这些库中的函数。

   C语言是所谓的“小内核”语言,就其语言本身来说很小(不多的关键字,程序流程控制,数据类型等)。所以,C语言内核开发出来之后,Dennis Ritchie和Brian Kernighan就用C本身重写了90%以上的UNIX系统函数,并且把其中最常用的部分独立出来,形成头文件和对应的LIBRARY,C运行时库就是 这样形成的。

   随着C语言的流行,各个C编译器的生产商/个体/团体都遵循老的传统,在不同平台上都有相对应的Standard Library,但大部分实现都是与各个平台有关的。由于各个C编译器对C的支持和理解有很多分歧和微妙的差别,所以就有了ANSI C;ANSI C(主观意图上)详细的规定了C语言各个要素的具体含义和编译器实现要求,引进了新的函数声明方式,同时订立了Standard Library的标准形式。所以C运行时库由编译器生产商提供。至于由其他厂商/个人/团体提供的头文件和库函数,应当称为第三方C运行库(Third party C run-time libraries)。

二、发展

  C运行时库诞生时是单线程的,随着操作系统多线程技术的发展,最初的C运行时库无法满足程序的需求。

   到了C++世界里(C++是C的超集),有了另外一个概念:Standard C++ Library(VC针对C++加入的Standard C++ Library主要包括:LIBC.LIB,LIBCMT.LIB和MSVCRT.LIB。),它包括了上面所说的C run-time library和STL。

  Windows环境下,Visual C++提供了两种版本的C运行时库:一个版本供单线程应用程序调用,另一个版本供多线程应用程序调用。

  Visual C++提供的多线程运行时库又分为静态链接库和动态链接库两类,而每一类运行时库又可再分为Debug版和Release版,因此Visual C++共提供了6个运行时库。

三、功能

  运行时库是程序在运行时所需要的库文件,通常以LIB或DLL形式提供:

  C运行时库                               库文件
  Single thread(static link)              libc.lib
  Debug single thread(static link)        libcd.lib
  MultiThread(static link)                libcmt.lib
  Debug multiThread(static link)          libcmtd.lib
  MultiThread(dynamic link)               msvcrt.lib
  Debug multiThread(dynamic link)         msvcrtd.lib

  C运行时库包含了C程序运行的最基本和最常用的函数。

  C运行时库除了给我们提供必要的库函数调用之外,它提供的另一个最重要的功能是为应用程序添加启动函数。

  C运行时库启动函数的主要功能为进行程序的初始化,对全局变量进行赋初值,加载用户程序的入口函数。

四、编译器链接选项

  VC带的编译器名字叫cl.exe,它有几个与标准程序库有关的选项:/ML、/MLd、/MT、/MTd、/MD、/MDd。编译时到底哪个C运行时库联入程序取决于这些编译选项,选项告诉编译器应用程序想使用什么版本的C标准程序库:

  /ML对应单线程静态版的标准程序库(libc.lib);
  /MT对应多线程静态版标准库(libcmt.lib),此时编译器会自动定义_MT宏;
  /MD对应多线程DLL版(导入库msvcrt.lib,DLL是msvcrt.dll),编译器自动定义_MT和_DLL两个宏。

  后面加d的选项都会让编译器自动多定义一个_DEBUG宏,表示要使用对应标准库的调试版,因此:

  /MLd对应调试版单线程静态标准库(libcd.lib);
  /MTd对应调试版多线程静态标准库(libcmtd.lib);
  /MDd对应调试版多线程DLL标准库(导入库msvcrtd.lib,DLL是msvcrtd.dll)。

  即:

  /ML 使用LIBC.lib创建单线程可执行文件
  /MLd 使用LIBCD.lib创建调试单线程可执行文件
  /MT 使用LIBCMT.lib创建多线程可执行文件
  /MTd 使用LIBCMTD.lib创建调试多线程可执行文件
  /MD 使用MSVCRT.lib创建多线程DLL
  /MDd 使用MSVCRTD.lib创建调试多线程DLL

  说明:

  (1)静态链接的单线程库

  静态链接的单线程库只能用于单线程的应用程序,C运行时库的目标代码最终被编译在应用程序的二进制文件中。
  通过/ML编译选项可以设置Visual C++使用静态链接的单线程库。

  (2)静态链接的多线程库

  静态链接的多线程库的目标代码也最终被编译在应用程序的二进制文件中,但是它可以在多线程程序中使用。
  通过/MT编译选项可以设置Visual C++使用静态链接的多线程库。

  (3)动态链接的运行时库

  动态链接的运行时库将所有的C库函数保存在一个单独的动态链接库MSVCRTxx.DLL中,MSVCRTxx.DLL处理了多线程问题。
  使用/MD编译选项可以设置Visual C++使用动态链接的运行时库。

   /MLd、/MTd或/MDd选项使用Debug Runtime Library(调试版本的运行时刻函数库),与/ML、/MT或/MD分别对应。Debug版本的Runtime Library包含了调试信息,并采用了一些保护机制以帮助发现错误,加强了对错误的检测,因此在运行性能方面比不上Release版本。

   程序运行时,很大一部分时间是在这些运行库里运行。在程序(Release版)被编译时,VC会根据编译选项(单线程、多线程或DLL)自动将相应的运 行时库文件(libc.lib、libcmt.lib或Import library msvcrt.lib)链接进来。

  注:修改编译选项,将/MD或/MDd改为/MT或/MTd,就实现了对VC运行时库的静态链接,在运行时就不再需要VC的dll了。

五、附:

  下面是MSDN关于Visual C++编译器选项的说明:

  这些选项选择单线程或多线程运行时例程,指示多线程模块是否为DLL,并选择运行时库的发布版本或调试版本。

  /MD

  使应用程序使用运行时库的多线程并特定于DLL的版本。定义_MT和_DLL,并使编译器将库名MSVCRT.lib放入.obj文件中。
  用此选项编译的应用程序静态链接到MSVCRT.lib。该库提供允许链接器解析外部引用的代码层。实际工作代码包含在MSVCR80.DLL中,该库必须在运行时对于与MSVCRT.lib链接的应用程序可用。
   当在定义了_STATIC_CPPLIB(/D_STATIC_CPPLIB)的情况下使用/MD时,它将导致应用程序与静态多线程标准C++库 (libcpmt.lib)而非动态版本(msvcprt.lib)链接,同时仍通过msvcrt.lib动态链接到主CRT。

  /MDd

  定义_DEBUG、_MT和_DLL,并使应用程序使用运行时库的调试多线程并特定于DLL的版本。它还使编译器将库名MSVCRTD.lib放入.obj文件中。

  /ML

  使编译器将库名LIBC.lib放入.obj文件中,以便链接器使用LIBC.lib解析外部符号。这是编译器的默认操作。LIBC.lib不提供多线程支持。

  /MLd

  定义_DEBUG并使编译器将库名LIBCD.lib放入.obj文件中,以便链接器使用LIBCD.lib解析外部符号。LIBCD.lib不提供多线程支持。

  /MT

  使应用程序使用运行时库的多线程静态版本。定义_MT并使编译器将库名LIBCMT.lib放入.obj文件中,以便链接器使用LIBCMT.lib解析外部符号。

  /MTd

  定义_DEBUG和_MT。此选项还使编译器将库名LIBCMTD.lib放入.obj文件中,以便链接器使用LIBCMTD.lib解析外部符号。

  /LD

  创建 DLL。
  将/DLL选项传递到链接器。链接器查找DllMain函数,但并不需要该函数。如果没有编写 DllMain函数,链接器将插入返回TRUE的DllMain函数。
  链接DLL启动代码。
  如果命令行上未指定导出(.exp)文件,则创建导入库(.lib);将导入库链接到调用您的DLL的应用程序。
  将/Fe(命名EXE文件)解释为命名DLL而不是.exe文件;默认程序名成为basename.dll而不是basename.exe。
  除非显式指定/MD,否则将暗指/MT。

  /LDd

  创建调试DLL。定义_MT和_DEBUG。

  警告

   不要混合使用运行时库的静态版本和动态版本。在一个进程中有多个运行时库副本会导致问题,因为副本中的静态数据不与其他副本共享。链接器禁止在.exe 文件内部既使用静态版本又使用动态版本链接,但您仍可以使用运行时库的两个(或更多)副本。例如,当与用动态(DLL)版本的运行时库链接的.exe文件 一起使用时,用静态(非DLL)版本的运行时库链接的动态链接库可能导致问题。(还应该避免在一个进程中混合使用这些库的调试版本和非调试版本)。

   注:/ML、/MLd貌似已经不提供;另,LIBC.LIB,LIBCMT.LIB和MSVCRT.LIB有对应的 LIBCP.LIB,LIBCPMT.LIB和MSVCPRT.LIB,作用不清楚,不知道是升级替换版本还是升级补充版本或其他功能,待续 -_-!...OY~orz

分享到:
评论

相关推荐

    vc运行时库(2005-2010,x86x64)

    在安装或更新这些库时,需要注意版本匹配,因为不同的VC++项目可能依赖特定版本的运行时库。 在64位系统上,通常需要同时安装x86和x64版本的运行时库,因为有些应用程序可能是32位的,而系统本身是64位的。这些库...

    VC2008运行时库

    **VC2008运行时库详解** Visual C++ 2008(简称VC2008)是微软开发的一款强大的C++编程工具,它为开发者提供了丰富的功能和高效的工作环境。在使用VC2008进行软件开发时,有时会遇到一个关键组件——VC2008运行时库...

    VC环境运行库

    西西软件园是一个知名的软件下载网站,可能提供了这个VC运行库的下载链接和使用说明。 总的来说,VC环境运行库对于Windows用户来说是必不可少的,特别是对于那些喜欢使用免安装软件或者经常遇到“缺少msvcrXX.dll”...

    VC.RedistInstaller(VC运行库文件)

    标题中的"VC RedistInstaller(VC运行库文件)"指的是一个用于安装VC++运行库的集合包,它包括了不同版本的VC运行时库,如VC2008、VC2010和VC2012等。这些运行库包含了C++标准库、MFC(Microsoft Foundation Classes)...

    VC运行库2011

    **VC运行库2011**是微软Visual C++开发工具的一个重要组成部分,它为基于C++编程语言的软件提供必要的运行环境。这些运行库包含了编译器生成的动态链接库(DLLs),使得计算机在运行使用Visual C++开发的应用程序时...

    vc运行库2014完全版

    VC运行库中的DLL文件,如msvcrXX.dll(XX表示版本号),提供了C运行时库、C++标准库、MFC库等必要的功能,例如内存管理、字符串操作、异常处理等。当一个使用VC++编译的程序启动时,系统会自动寻找并加载对应的运行...

    VC8.0运行库_VC运行库最新版本.rar

    "VC8.0运行库_VC运行库最新版本.rar"是一个包含VC++8.0运行库安装程序和其他相关资源的压缩包。`vcredist_x86.exe`是关键文件,用于确保32位系统能够运行使用VC++8.0编译的软件。同时,提供的链接文件可能指向更多...

    VC6 MFC运行库

    **VC6 MFC运行库详解** ...总的来说,VC6 MFC运行库是支持使用VC6开发的MFC程序运行所必需的组件,包括MFC核心库文件、C运行时库文件等。在部署和维护这些程序时,理解这些库的作用和依赖关系至关重要。

    vc9 vc11 vc14运行库

    总结来说,VC9, VC11, 和 VC14 运行库是运行由相应版本的Visual C++编译的程序所必需的组件,它们提供了C++运行时环境,包括内存管理和多线程支持等功能。对于开发者和用户而言,确保正确安装这些运行库是确保软件...

    VC运行库V9

    **VC运行库V9详解** VC运行库是微软Visual C++编译器生成的动态链接库(DLL),它们包含了运行由VC++开发的应用程序所需的多种关键功能和组件。标题中的"VC运行库V9"指的是Microsoft Visual C++ 2008 ...

    VC2005运行库,VC2005运行库

    VC2005运行库主要提供了对C++标准库、MFC(Microsoft Foundation Classes)、ATL(Active Template Library)以及C运行时库(CRT)的支持。这些库包含了C++编程中的常用功能,如字符串处理、内存管理、I/O操作、线程...

    vc9、vc11运行库32

    有时,由于不同的PHP版本可能依赖于不同版本的VC运行库,因此在切换版本时可能会出现缺失相应运行库的错误。 压缩包内的文件"vc11_x86.exe"和"vc9_x86.exe"是分别对应VC11和VC9的32位安装程序。在安装这两个运行库...

    VC15运行库(X86/X64)

    VC运行库主要由多个版本组成,包括x86(32位)和x64(64位)版本,以满足不同架构的系统需求。"VC_redist.x64.exe"是64位系统的安装包,而"VC_redist.x86.exe"则是为32位系统设计的。它们分别包含了各自对应平台上...

    vc运行时绿色版

    在使用VC编译的程序中,常常需要依赖一些运行时库才能正常运行,这些库就是所谓的"VC运行时"。本绿色版集合了从VC6到VC2015的常用运行时动态库,涵盖了多个版本,包括对MFC(Microsoft Foundation Classes)的支持。...

    VC运行时库的集成补丁

    玩游戏,或者运行啥程序,提示缺乏各种动态库的,都可以使用这个工具进行安装,集成了VC2005到VC2019的运行时库,且不会与系统中的原有类似动态库冲突(都是微软官方整合的),非常推荐出现类似问题然后网上到处找...

    vc140运行库

    当运行程序时出现“缺少XXX.dll”错误,通常是因为该程序依赖的VC140运行库未正确安装或找不到。此时,可以从已提供的压缩包中提取所需的DLL文件,如msvcp140.dll、vcruntime140.dll等,并将其复制到出错程序的执行...

    VC程序部署运行时需要的库

    在Windows平台上,VC运行时库分为两种版本:x86(32位)和x64(64位)。这对应于压缩包内的`vcredist_x86.exe`和`vcredist_x64.exe`文件,它们分别是32位和64位系统的运行时库安装程序。当用户尝试运行由VS2008编译...

    vc9、vc11、vc14 32位运行库

    **VC9、VC11、VC14 32位运行库详解** 在Windows操作系统上,许多基于C++编译的程序需要特定版本的Visual C++ Redistributable Packages才能正常...在遇到运行库错误时,通过安装对应的VC运行库可以有效地解决问题。

    VC11 运行库 (32位)

    **VC11运行库(32位)**是微软Visual C++的一个重要组成部分,主要用于支持运行使用Visual C++ 2012编译器开发的32位应用程序。这个运行库包含了必要的动态链接库(DLLs),这些库是很多Windows应用程序在执行时需要...

Global site tag (gtag.js) - Google Analytics