zoukankan      html  css  js  c++  java
  • 编程 MD(d)、MT(d)编译选项的区别

    转:http://blog.csdn.net/nodeathphoenix/article/details/7550546

    1.各个选项代表的含义

    编译选项

    包含

    静态链接的lib

    说明

    /MD

    _MT、_DLL

    MSVCRT.lib

    多线程、Release、DLL版本的运行时库  ---只能用于Release版本

    /MDd

    _DEBUG、_MT、_DLL

    MSVCRTD.lib

    多线程、Debug、DLL版本的运行时库  ----只能用于Debug版本

    /MT

    _MT

    LIBCMT.lib

    多线程、Release版本的运行时库

    /MTd

    _DEBUG、_MT

    LIBCMTD.lib

    多线程、Debug版本的运行时库

    简单的说:

    (1)/MD,表示运行时库由操作系统提供一个DLL,程序里不集成。

    (2)/MT,表示运行时库由程序集成,程序不再需要操作系统提供运行时库DLL。

    /MT是"multithread, static version" 意思是多线程静态的版本,定义了它后,编译器把LIBCMT.lib安置到OBJ文件中,让链接器使用LIBCMT.lib 处理外部符号。

    /MD是"multithread- and DLL-specific version",意思是多线程DLL版本,定义了它后,编译器把MSVCRT.lib安置到OBJ文件中,它连接到DLL的方式是静态链接,实际上工作的库是MSVCR80.DLL。

    即:

    静态运行时库:LIBCMT.lib

    动态运行时库:MSVCRT.lib +MSVCR80.DLL

    2./MD、/MT的选择

          1、为什么选择/MD,不选/MT?

             (1)程序就不需要静态链接运行时库,可以减小软件的大小;

             (2)所有的模块都采用/MD,使用的是同一个堆,不存在A堆申请,B堆释放的问题。

          2、为什么选择/MT,不选择/MD?

             (1)有些系统可能没有程序所需要版本的运行时库,程序必须把运行时库静态链接上。

          3、多个模块,必须选择相同类型的运行时库,不要混合使用。

    3.选择/MT需要解决的堆空间释放问题

             不同的模块各自有一份C运行时库代码,各个C运行库会有各自的堆,导致了各个模块会有各自的堆。如果在A堆中申请空间,到B堆中释放就会有崩溃,在模块A申请的空间,必须在模块A中释放。

             附件(下载地址:http://files.cnblogs.com/cswuyg/Test_MD_and_MT.rar)的DLL以及DLLUser代码,以STL的string为例,通过修改编译选项验证了这个问题。(string在赋值的时候需要释放掉原来的空间,然后再申请新的空间存储新的内容。)

  • 相关阅读:
    opencv 单应矩阵
    对极约束
    opencv Mat 操作
    两个视角得到世界坐标系
    opencv storage 操作C++
    Python操作mysql数据库
    java——保留一位、两位小数
    数据库 select from 库名 表名 的用法
    python 使用国内镜像下载插件及报错Could not fetch URL https://pypi.org/simple/pywinauto/: There was a problem co解决方法
    pycharm下载第三方库AttributeError: module 'pip' has no attribute 'main'问题解决
  • 原文地址:https://www.cnblogs.com/pkjplayer/p/6544989.html
Copyright © 2011-2022 走看看