MD(d)、MT(d)编译选项的区别
来源:互联网 发布:mac装linux虚拟机 编辑:程序博客网 时间:2024/05/16 07:35
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)有些系统可能没有程序所需要版本的运行时库,程序必须把运行时库静态链接上。
(2)减少模块对外界的依赖。
3、多个模块,必须选择相同的运行时库。
三、选择/MT需要解决的堆空间释放问题
不同的模块各自有一份C运行时库代码、或者根本没有C运行时库,导致了各个模块会有各自的堆。如果在A堆中申请空间,到B堆中释放就会有崩溃,在模块A申请的空间,必须在模块A中释放。
附录的DLL以及DLLUser代码,以STL的string为例,通过修改编译选项验证了这个问题。string在赋值的时候需要释放掉原来的内存空间,然后再申请新的内存空间存储新的内容,如果跨模块了,释放的时候就存在“A模块申请B模块释放”的问题,导致程序崩溃。
From:http://www.cnblogs.com/cswuyg/archive/2012/02/03/2336424.html
- Windows编程 MD(d)、MT(d)编译选项的区别
- Windows编程 MD(d)、MT(d)编译选项的区别
- Windows编程 MD(d)、MT(d)编译选项的区别
- MD(d)、MT(d)编译选项的区别
- Windows编程 MD(d)、MT(d)编译选项的区别 .
- Windows编程 MD(d)、MT(d)编译选项的区别
- Windows编程MD(d)、MT(d)编译选项的区别
- MD(d)、MT(d)编译选项的区别————简单易懂
- vs中编译选项MD、MDd、MT的区别
- VC编译选项 /ML /MLd /MT /MTd /MD /MDd之间的区别
- VC编译选项 /ML /MLd /MT /MTd /MD /MDd之间的区别
- 【PE】VS编译选项MD,MDd,MT,MTd的使用和区别
- Visual Studio 2015 中关于运行时库的设置 /MD[d]、/MT[d]、/LD[d]
- VC编译选项 /MT /MTd /MD /MDd
- VC编译选项 MT MTd MD MDd
- VC编译时: MT,MTd,MD,MDd的区别
- MD和MT的区别
- MT和MD的区别
- SO_TIMESTAMP - 《Unix网络编程》中未提及的Socket选项
- 原码 反码 补码
- 函数调用中缺少哨兵 [-Wformat]
- POJ 2251 Dungeon Master
- 电驴提示“该内容尚未提供权利证明,无法提供下载”之解决办法详解
- MD(d)、MT(d)编译选项的区别
- 借生产者/消费者问题讲PV操作
- Android中的线程处理
- 稀疏表示+子空间学习 (ICCV2011)
- ostringstream用法
- Shell脚本语法-- if/then/elif/else/fi
- 转发ECCV2012感兴趣的文章列表
- 【怀念张国荣继续宠爱十年音乐会】下载
- jsp的九大内置对象?对应servlet中的java对象?