• VC运行时库/MD、/MDd、/MT、/MTd说明


    http://blog.csdn.net/holybin/article/details/26134153


    VC运行时库设置:VC项目属性—>配置属性—>C/C++—>代码生成—>运行时库。可以采用的方式有:多线程(/MT)、多线程调试(/MTd)、多线程DLL(/MD)、多线程调试DLL(/MDd)、单线程(/ML)、单线程调试(/MLd)。VS2008目前支持以上4种:


    各运行时库的说明,参考MSDN的/MD、/MT、/LD(使用运行时库)[msdn.microsoft.com/zh-cn/library/2kzt1wy3(v=vs.90).aspx]

    Reusable Library

    Switch

    Library

    Macro(s) Defined

    Description

    Single Threaded

    /ML

    LIBC

    (none)

    VS2003以后被废弃。

    Debug Single Threaded

    /MLd

    LIBCD

    _DEBUG

    VS2003以后被废弃。

    Static MultiThread

    /MT

    LIBCMT

    _MT

    使应用程序使用运行时库的多线程静态版本。定义 _MT 并使编译器将库名 LIBCMT.lib 放入 .obj 文件中,以便链接器使用 LIBCMT.lib 解析外部符号。

    Debug Static MultiThread

    /MTd

    LIBCMTD

    _DEBUG and _MT

    定义 _DEBUG 和 _MT。此选项还使编译器将库名 LIBCMTD.lib 放入 .obj 文件中,以便链接器使用 LIBCMTD.lib 解析外部符号。

    Dynamic Link (DLL)

    /MD

    MSVCRT

    _MT and _DLL

    使应用程序使用运行时库的多线程并特定于 DLL的版本。定义 _MT 和 _DLL,并使编译器将库名 MSVCRT.lib 放入 .obj 文件中。

    用此选项编译的应用程序静态链接到 MSVCRT.lib。该库提供允许链接器解析外部引用的代码层。实际工作代码包含在 MSVCR90.DLL, 中,该库必须在运行时对于与 MSVCRT.lib 链接的应用程序可用。

    当 /MD 与 _STATIC_CPPLIB 预处理器定义 (/D_STATIC_CPPLIB) 一起使用时,您的应用程序将与静态多线程标准 C++ 库 (libcpmt.lib) 而非动态版本 (msvcprt.lib) 链接,但仍通过 msvcrt.lib 动态链接到主 CRT。

    请注意,不支持 _STATIC_CPPLIB 预处理器定义和 /clr 或 /clr:pure 编译器选项的组合。有关 /clr 选项的限制的更多信息,请参见/clr 限制

     

    Debug Dynamic Link (DLL)

    /MDd

    MSVCRTD

    _DEBUG, _MT, and _DLL

    定义 _DEBUG_MT 和 _DLL,并使应用程序使用运行时库的调试多线程并特定于 DLL 的版本。它还使编译器将库名 MSVCRTD.lib 放入 .obj 文件中。


    其中以小写“d”结尾的选项表示的DEBUG版本的,没有“d”的为RELEASE版本。

    (1)/MT和/MTd表示采用多线程CRT库的静态lib版本。该选项会在编译时将运行时库以静态lib的形式完全嵌入。该选项生成的可执行文件运行时不需要运行时库dll的参加,会获得轻微的性能提升,但最终生成的二进制代码因链入庞大的运行时库实现而变得非常臃肿。当某项目以静态链接库的形式嵌入到多个项目,则可能造成运行时库的内存管理有多份,最终将导致致命的“Invalid Address specified to RtlValidateHeap”问题。另外托管C++和CLI中不再支持/MT和/MTd选项。

    (2)/MD和/MDd表示采用多线程CRT库的动态dll版本,会使应用程序使用运行时库特定版本的多线程DLL。链接时将按照传统VC链接dll的方式将运行时库MSVCRxx.DLL的导入库MSVCRT.lib链接,在运行时要求安装了相应版本的VC运行时库可再发行组件包(当然把这些运行时库dll放在应用程序目录下也是可以的)。 因/MD和/MDd方式不会将运行时库链接到可执行文件内部,可有效减少可执行文件尺寸。当多项目以MD方式运作时,其内部会采用同一个堆,内存管理将被简化,跨模块内存管理问题也能得到缓解。

    (3)结论:/MD和/MDd将是潮流所趋,/ML和/MLd方式请及时放弃,/MT和/MTd在非必要时最好也不要采用了。大型项目中必须要求所有组件和第三方库的运行时库是统一的,否则将会出现链接器工具错误 LNK2005 (C++)[msdn.microsoft.com/zh-cn/library/72zdcz6f(VS.80).aspx]井喷。

    (4)实际使用参考:visual studio运行时库MT、MTd、MD、MDd的研究


    Keep it simple!
    作者:N3verL4nd
    知识共享,欢迎转载。
  • 相关阅读:
    Sql Sugar
    GoLang 环境部署
    Typora 自动添加序号
    C# 操作 Oracle批量执行Insert Blob
    C# 生成读取二维码
    Asp.net core 使用Serilog记录日志
    Asp.net Core 将日志输出到文件
    云原生领域的一些技术展望
    C# BeginInvoke用法记录
    C# 委托及线程
  • 原文地址:https://www.cnblogs.com/lgh1992314/p/5834676.html
Copyright © 2020-2023  润新知