• 编程 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在赋值的时候需要释放掉原来的空间,然后再申请新的空间存储新的内容。)

  • 相关阅读:
    SZU:B47 Big Integer II
    Plan : 破晓
    C程序设计语言(第二版)习题:第二章
    Linux : fedora 安装 vnc server
    Linux系统编程:客户端-服务器用FIFO进行通信
    Linux系统编程:dup2()重定向
    Vijos: P1046观光旅游
    FLOYD 求最小环
    uva 401.Palindromes
    codeforces Educational Codeforces Round 5 A. Comparing Two Long Integers
  • 原文地址:https://www.cnblogs.com/pkjplayer/p/6544989.html
Copyright © 2020-2023  润新知