MD(d)、MT(d)编译选项的区别
一、MD(d)、MT(d)编译选项的区别
1、编译选项的位置
以VS2005为例,这样子打开:
1) 打开项目的Property Pages对话框
2) 点击左侧C/C++节
3) 点击Code Generation节
4) 右侧第六行Runtime Library项目
2、各个设置选项代表的含义
编译选项 |
包含 |
静态链接的lib |
说明 |
/MD |
_MT、_DLL |
MSVCRT.lib |
多线程、Release、DLL版本的运行时库 |
/MDd |
_DEBUG、_MT、_DLL |
MSVCRTD.lib |
多线程、Debug、DLL版本的运行时库 |
/MT |
_MT |
LIBCMT.lib |
多线程、Release版本的运行时库 |
/MTd |
_DEBUG、_MT |
LIBCMTD.lib |
多线程、Debug版本的运行时库 |
简单的说:
(1)/MD,表示运行时库由操作系统提供一个DLL,程序里不集成。
(2)/MT,表示运行时库由程序集成。
二、/MD、/MT的选择
1、为什么选择/MD,不选/MT?
(1)程序就不需要静态链接运行时库,可以减小软件的大小;
(2)所有的模块都采用/MD,使用的是同一个堆,不存在A堆申请,B堆释放的问题。
2、为什么选择/MT,不选择/MD?
(1)有些系统可能没有程序所需要版本的运行时库,程序必须把运行时库静态链接上。
3、多个模块,必须选择相同的运行时库。
三、选择/MT需要解决的堆空间释放问题
不同的模块各自有一份C运行时库代码、或者根本没有C运行时库,导致了各个模块会有各自的堆。如果在A堆中申请空间,到B堆中释放就会有崩溃,在模块A申请的空间,必须在模块A中释放。
附件(下载地址:http://files.cnblogs.com/cswuyg/Test_MD_and_MT.rar)的DLL以及DLLUser代码,以STL的string为例,通过修改编译选项验证了这个问题。(string在赋值的时候需要释放掉原来的空间,然后再申请新的空间存储新的内容。)
四、参考资料
1、微软关于MT、MD等的详细介绍
http://msdn.microsoft.com/en-us/library/2kzt1wy3(v=VS.71).aspx
2、不要出现A模块申请,B模块释放的情况
http://www.cnblogs.com/minggoddess/archive/2010/12/15/1907179.html
3、运行时库有哪些版本
http://www.cppblog.com/MichaelLiu/articles/10607.html
4、CSDN上关于堆空间释放的讨论
http://topic.csdn.net/t/20010112/09/57983.html
http://topic.csdn.net/t/20031009/17/2338051.html
http://topic.csdn.net/u/20090502/00/bf1602e3-ddf5-49b0-af81-8a23383f9ddc.html
http://blog.csdn.net/blz_wowar/article/details/2176536
5、不同模块不同的堆
http://www.cnblogs.com/WengYB/archive/2011/08/18/2144727.html
转载于:https://www.cnblogs.com/xuybin/p/3198612.html
MD(d)、MT(d)编译选项的区别相关推荐
- /MD 与 /MT、/MTD与/MDD的区别
VS在 属性页的 C/C++ -> Code Generation -> Runtime Library 一项中总共有四个选项 /MD 与 /MT./MTD与/MDD,它们分别有什么区别? ...
- VS 编译时 /MD 与 /MT、/MTD与/MDD的区别
VS在 属性页的 C/C++ -> Code Generation -> Runtime Library 一项中总共有四个选项 /MD 与 /MT./MTD与/MDD,它们分别有什么区别? ...
- /MD与/MT、/MTD与/MDD的区别
/MD 使应用程序使用运行时库的多线程并特定于DLL 的版本.定义 _MT 和 _DLL,并使编译器将库名 MSVCRT.lib 放入 .obj文件中.用此选项编译的应用程序静态链接到MSVCRT.l ...
- VC运行时库(/MD、/MT等)
VC项目属性→配置属性→C/C++→代码生成→运行时库 可以采用的方式有:多线程(/MT).多线程调试(/MTd).多线程DLL(/MD).多线程调试DLL(/MDd).单线程(/ML).单线程调试( ...
- 如何判断lib是/md or /mt编译的
如何判断lib是/md or /mt编译的 使用dumpbin.exe 打开命令行 输入 dumpbin.exe /directives xxx.lib 其中 /DEFAULTLIB 显示是哪一种方 ...
- /MD /MDd /MT /MTd
在VC下面,有4个参数是跟静态/动态编译有关的. /MD /MDd /MT /MTd 其中, MT , MTd可以认为是静态编译.也就是说,设置成MT, MTd后编译出来的*.exe程序在 ...
- VS中MD和MT的区别
MT: mutithread Static,多线程库,编译器会从运行时库里面选择多线程静态连接库来解释程序中的代码,即连接LIBCMT.lib库 MTd:mutithread debug Static ...
- window下libevent编译及其使用
1.编译选项-MT/MD: 类别 说明 静态连接 多线程(/MT) 多线程Release.DLL版运行时库 ,只能用于Release版本 LIBCMT.lib 多线程调试(/MTd) 多线程Debu ...
- VS配置选项MT和MD的区别
目录 /MD./MT的选择 区别1:全局堆句柄不一样 区别2:链接的运行时库不同 区别3:编译出来的PE文件大小区别 visual studio运行时库MT.MTd.MD.MDd的研究 /MD./MT ...
最新文章
- 为什么要用OKR?OKR在什么情况下用?
- 注意力是智力的五个基本因素之一
- pycharm的updating indices
- 在JConsole和VisualVM中查看DiagnosticCommandMBean
- android 字体描边实现,android文字描边功能的实现
- 吴恩达《机器学习》学习笔记十——神经网络相关(2)
- python模式匹配算法_【python算法书】单词模式匹配?
- 语义slam_语义SLAM: 接轨深度学习的新方向
- 多媒体技术开发迎来新常态
- SpringMvc Eclipse搭建web项目
- BZOJ1604 洛谷2906:[USACO2008 OPEN]Cow Neighborhoods 奶牛的邻居——题解
- ruby 1.9.3 字符和asscii转换
- lisp如何将度分秒转换为弧度_3 角 度分秒与弧度互相转换
- 常见程序(discuz,ecshop,shopex,dedecms等)重置破解管理密码
- 绝地求生显示lsukn服务器,电脑中玩绝地求生出现Failed to initialize BattlEye Service:Generic Error怎么办...
- 2022最新MN梦奈宝塔主机系统V1.5版本+UI不错
- 国企央企OFFER收割全攻略 | 银行篇之差额体检答疑
- 不再依赖光荣,全新脚本引擎还原《三国志曹操传》
- “被讨厌的勇气:‘自我启发之父‘阿德勒的哲学课“ 读书笔记
- 微信|如何申请一个小号
热门文章
- python response重头开始_用 Python 抓取公号文章保存成 PDF
- Stanford机器学习---第4讲. 神经网络的表示 Neural Networks representation
- 交易系统典藏书籍总汇以及系统交易、程序化交易等经典资料收藏
- java中关于x轴翻转和y轴翻转如何计算_如何用加速度计提高倾角测量精度?
- java hssfsheet_Java中,使用HSSFSheet创建excel模板如何创建一列两行的数据?
- 评分卡模型开发(一)--用户数据缺失值处理
- 图像形状特征(二)--Hu距
- pdf怎么打开上次看到的地方_ppt如何转pdf?俩种方法轻松搞定
- 第三方app_官方打不过第三方APP之 知乎 篇
- redis scala编程之创建连接