vc++编译时运行库选择(/MT/MTd/MD/MDd)

vc++编译时运行库选择(/MT、/MTd、/MD、/MDd)

在vs中,项目属性 -》C/C++ -》代码生成 -》运行库 选项内有四个选项:多线程(/MT)、多线程调试(/MTd)、多线程DLL(/MD)、多线程调试DLL(/MDd)。这个设置代表什么意思?四个选项又是什么意思,有什么区别?接下来详细讨论。

先奉上一个写得非常详细的博客链接:你所不知道的C和C++运行库,这个文章中写得非常详细,本文也主要参考了这篇文章。

还有这篇C Runtime Library 的来历。

何为C运行库、C++标准库

C标准定义了一系列常用函数,成为C库函数。C标准仅仅定义了函数原型,没有提供实现。因此这个任务留给了各个支持C语言标准的编译器。每个编译器通常实现了标准C的超集,称为C运行时库(C Run-Time Library)。C run-time Library包含了C程序运行的最基本和最常用的函数,没有C run-time Library则main()函数不会被调用,exit()也不能被响应。C运行库与平台相关。

到了C++的世界,有了另外一个概念:Standard C++ Library。因为C++是C的超集,所以Standard C++ Library包括了C run-time Library和STL。VC针对C++ 加入的Standard C++ Library主要包括:libcp.lib、libcpmt.lib、msvcprt.lib。

在windows环境下,VC提供的C Run-Time Library又分为动态运行时库和静态运行时库。动态运行时库主要是DLL库文件msvcrt.dll(vc 6.0,之后是msvcr100.dll等),静态运行时库对应的主要文件是libc.lib(Single thread static library, retail version) 、LIBCMT.LIB (Multithread static library, retail version) 。msvcrt.dll运行时库提供几千个C函数,包括printf,程序运行时很大部分时间都是在这些运行库中。到底使用哪些库取决于你的编译器及编译选项:/MT、/MTd、/MD、/MDd。

动态运行时库

动态运行时库主要包括:

·DLL库文件:msvcrt.dll(或 MSVCRTD.DLL for debug build)

·对应的Import Library文件:MSVCRT.LIB(或 MSVCRTD.LIB for debug build)

上面为vc6.0编译器用到的库,在vs中为msvcr100.dll等

DLL版本名称根据编译器不同而不同,我们可以从名称上加以分辨。

VC6.使用的CRT库的DLL版本在MSVCRT.DLL中实现, 对应调试版本为MSVCRTD.LIB。

VC2005使用的CRT库的DLL版本在MSVCR80.DLL中实现,对应调试版本为MSVCR80.DLL。

VC2008使用的CRT库的DLL版本在MSVCR90.DLL中实现,对应调试版本为MSVCR90D.DLL。

VC2010使用的CRT库的DLL版本在MSVCR100.DLL中实现,对应调试版本为MSVCR100D.DLL。

静态运行时库

静态运行时库(release版)对应的主要文件包括:

LIBC.LIB(Single thread static library, retail version)

LIBCMT.LIB(Multithread static library, retail version)

不同编译器实现的库名都相同,都为libcmt.lib,调试版为libcmtd.lib。

C++标准库

对于C++标准库中的IO流和STL,VC6.0、VC2005、VC2008和VC2010也提供了DLL版本和LIB版本。

LIB版均实现在libcpmt.lib中,对应的调试版本为libcpmtd.lib。

不同版本的编译器实现的DLL也不相同。

VC6.使用的C++类库的 DLL版本在MSVCP60.DLL中实现, 对应调试版本为MSVCP60D.LIB。

VC2005使用的C++类库的DLL版本在MSVCP80.DLL中实现,对应调试版本为MSVCP80.DLL。

VC2008使用的C++类库的 DLL版本在MSVCP90.DLL中实现,对应调试版本为MSVCP90D.DLL。

VC2010使用的C++类库的DLL版本在MSVCP100.DLL中实现,对应调试版本为MSVCP100D.DLL。

编译器中运行库设置

/MT、/MTd、/MD、/MDd各选项区别

MT选项:链接LIB版的C和C++运行库。在链接时就会在将C和C++运行时库集成到程序中成为程序中的代码,程序体积会变大。

MTd选项:LIB的调试版。

MD选项:使用DLL版的C和C++运行库,这样在程序运行时会动态的加载对应的DLL,程序体积会减小,缺点是在系统没有对应DLL时程序无法运行。

MDd选项:表示使用DLL的调试版。

带T的链接静态库lib;带D链接动态库dll;带d为调试版本,库名加d

如何选择运行库

先看几个错误:

1. error LNK2038

2. error LNK2005

当引用的库和当前项目设置的运行库不一致时,会出现error LNK2038: 检测到“RuntimeLibrary”的不匹配项………

当引用的库或当前的库有一个使用/MT时,会出现error LNK2005:………

所以若当前VC项目不引用其他VC项目,则可以使用任意一种运行库选项;若需要引用其他VC项目,则所有的项目都需设置运行库选项为/MD或/MDd。

vc++编译时运行库选择(/MT/MTd/MD/MDd)相关教程

vs编译c语言停止工作运行库mt,vc++编译时运行库选择(/MT/MTd/MD/MDd)相关推荐

  1. c语言程序可以单独编译,c语言中的函数可不可以单独进行编译?_后端开发

    在C语言中,要求参加运算的数必须是整数的运算符是什么_后端开发 在C语言中要求参加运算的数必须是整数的运算符是"%":"%"符号在c语言中有两种释义,一是求余符 ...

  2. matlab打开显示系统错误,win7系统笔记本运行Matlab软件弹出已停止工作错误窗口的解决方法...

    无论谁在使用电脑的时候都可能会发现笔记本运行Matlab软件弹出已停止工作错误窗口的问题,笔记本运行Matlab软件弹出已停止工作错误窗口让用户们很苦恼,这是怎么回事呢,笔记本运行Matlab软件弹出 ...

  3. vs配置编译c语言,为 VSCode 配置 C 语言编译环境

    1. 前提条件 安装 VSCode 以及 MinGW 安装好 VSCode 中的 C/C++ 扩展 [图片上传失败...(image-e93c7c-1606314000230)] PS: 我建议使用 ...

  4. 解析性语言与编译性语言优劣对比

    高级编程语言分为解析语言和编译性语言,各自代表有Js,python 以及c/c++,golang等,java某种意义上说既是解析语言也是编译性语言. 以下是解析语言与编译性语言的一些优劣对比: 1:效 ...

  5. win10三国志14已停止工作解决方法--win10专业版

    三国志14是一款玩起来很过瘾的游戏,而最近不少用户都普遍遇到了一登录就提示已停止工作的情况,那么该怎么去解决呢?下面就一起来看看详细的解决方法吧. win10三国志14已停止工作: 1.在游戏时按下& ...

  6. 一文带你弄懂Visual Studio:运行时库及MT/MTD、MD/MDD

    一文带你弄懂Visual Studio:运行时库及MT/MTD.MD/MDD 引子 什么是Runtime Library? Runtime Library和运行库 MT MTD MD MDD的关系 静 ...

  7. 如何解决老是弹出“com surrogate已停止工作”窗口

    如何解决老是弹出"com surrogate已停止工作"窗口 1.首先我们右键单击计算机选择打开"属性",之后点击打开"高级系统设置". 2 ...

  8. win7 上面 gcc 编译的程序 a exe 运行的时候报错 a exe 已停止工作, 异常代码 c0000005

    win7 上面 gcc 编译的程序 a.exe 运行的时候报错 a.exe 已停止工作, 异常代码:c0000005: 原因分析: 一开始我以为是我的代码的问题,后来查询了这个错误码发现原来是兼容性的 ...

  9. [ARM]【编译】【实践】 - 浮点编译选项NEON引发的Skia的库Illegal instruction运行错误和解决办法

    前言,ARM编译器选项除了优化系统代码性能外,往往还具备其他一些设定,例如警告级别,和指令集的扩展 本文论述工作中遇到的一个编译开源浏览器chromine遇到的问题,由编译选项引发的可执行文件的Ill ...

最新文章

  1. android系统release签名
  2. python中有关数据持久存储:pickle模块的基本使用
  3. git--- 删除不存在对应远程分支的本地分支
  4. .NET 5 部署在docker上运行
  5. 蓝桥杯真题训练 2019.4题
  6. 带你玩转七牛云存储——高级篇
  7. 垃圾回收(三)-gc模块
  8. 舍选法抽样matlab,舍选抽样法.PPT
  9. Java Unable to load library ‘gsdll64‘: 报错,解决方案
  10. Java虚拟机垃圾回收
  11. LLVM各种格式转换图
  12. Java连接数据库导致连接数占满
  13. 步进电机、伺服电机、舵机的区别与控制(角度、转速)
  14. _raw_writel, writel_relaxed 和 writel的区别
  15. js原生后代选择器_jQuery的后代选择器ancestor descendant介绍和示例解析
  16. animation心形--表白
  17. c语言万能编程模板_8051单片机C语言通用万能编程模板
  18. Git从入门到放弃的Day10
  19. 生成数字相加验证码图片并验证
  20. 怎么让照片变年轻_怎么把照片变年轻

热门文章

  1. html tab切换jquery,jQuery版Tab标签切换
  2. android intent-filter作用,Android中Intent-Filter的匹配规则是什么
  3. 作者:许洪波,男,博士,中国科学院计算技术研究所副研究员、硕士生导师。...
  4. 【软件测试】软件测试札记
  5. 【离散数学】实验 一个简单的自动逻辑推理问题
  6. 【Python】Sklearn线性回归模型预测波士顿房价并绘图
  7. 【面向对象】面向对象程序设计测试题7-对象之间的has-a/many关系测试题
  8. 2.5 Go 算术运算与变量使用技巧
  9. ****** 三十三 ******、软设笔记【存储器系统】-主存储器、辅存储器
  10. 在linux程序里面,知道一个函数地址,改函数是属于某个动态库的,怎么样得到这个动态库的全【转】...