`
qimo601
  • 浏览: 3449134 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

VC 运行时库 /MD、/MDd 和 /MT、/MTd

阅读更多

这里总结下他们的区别,后面的那个'd'是代表DEBUG版本,没有'd'的就是RELEASE版本了。

首先说/MT

/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

所以,当你用CMAKE生成工程文件时,若CMAKE是用/MT生成的(查看工程原始目录的CMakeLists.txt),则它所调用的运行时库为:LIBCMT.lib,若生成的工程的运行时库(Runtime Library)你选择/MD,则此工程在编译后链接的时候,将会调用动态运行时库:MSVCRT.lib + MSVCR80.DLL,明显,两次对同一个某运行时库里的函数调用的库不同,则会出现重定义的错误。若此工程生成的是库文件,则其他工程调用此库时也必须是/MT。

===============================================

VC项目属性→配置属性→C/C++→代码生成→运行时库 可以采用的方式有:多线程(/MT)、多线程调试(/MTd)、多线程DLL(/MD)、多线程调试DLL(/MDd)、单线程(/ML)、单线程调试(/MLd)

 

Reusable Library Switch Library Macro(s) Defined
Single Threaded /ML LIBC (none)
Static MultiThread /MT LIBCMT _MT
Dynamic Link (DLL) /MD MSVCRT _MT and _DLL
Debug Single Threaded /MLd LIBCD _DEBUG
Debug Static MultiThread /MTd LIBCMTD _DEBUG and _MT
Debug Dynamic Link (DLL) /MDd MSVCRTD _DEBUG, _MT, and _DLL

 

 

    其中以小写“d”结尾的选项表示的DEBUG版本的,没有“d”的为RELEASE版本。大型项目中必须要求所有组件和第三方库的运行时库是统一的,否则将会出现LNK2005井喷。

    单线程运行时库选项/ML和/MLd在VS2003以后就被废了。

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

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

    结论:/MD和/MDd将是潮流所趋,/ML和/MLd方式请及时放弃,/MT和/MTd在非必要时最好也不要采用了。

 

[麻烦各位手下留情,抽空点一下,博文下面的谷歌广告呗]

  • 大小: 28.2 KB
分享到:
评论

相关推荐

    opencv_2413.6_vs2010_x86_MTd_MT_MDd_MD

    - 根据项目需求选择合适的运行时库配置(/MD、/MDd、/MT、/MTd)。 - 确保所有依赖项都已正确设置,包括头文件目录和库目录。 - 对于静态库,注意可能出现的链接冲突或大小问题,因为静态库会将所有依赖的库代码包含...

    opencv_2413.6_vs2010_x86_MTd_MT_MDd_MD_pdb

    4. **MDd/MD/MTd/MT**:这些是链接器选项,它们定义了运行时库的多线程和调试版本。MD和MDd分别代表多线程DLL(动态链接库)的调试和非调试版本,它们依赖于VC++运行时库的动态链接版本。MT和MTd则对应于多线程静态...

    VS2010编译的libcurl_openssl_zlib可直接使用的32位静态库

    **/MD 和 /MDd** 则对应动态链接C运行时库的选项。当使用这些选项编译时,libcurl库会依赖系统上的msvcr100.dll(或对应的调试版本msvcr100d.dll)。这样做的好处是减少了可执行文件的大小,因为运行时库代码是共享...

    teigha官方示例(C#/cad/dwg/dxf)

    md, mt - Visual Studio 编译器选项(静态库); dbg - 表示存在调试信息(/mtd、/mdd 等); rwd - 包含调试信息的发布版本(用于重现某些类型的运行时问题); amd64 - 为 x86 AMD64 平台构建的库。 TD_CHM_Docs ...

    转载:已编译好的openssh库

    我在链接OpenSSL的静态函数库时遇到类似以下的问题: Linking... msvcrt.lib(MSVCRT.dll) : error LNK2005: _strchr already defined in libcmtd.lib(strchr.obj) ... 这是由于OpenSSL的静态函数库使用的是了...

    VC下jsoncpp的使用入门

    3. **选择编译类型**:在编译jsoncpp的库文件时,需要根据实际情况选择编译模式,例如Debug或Release版本,以及是否使用动态运行时库(/MD或/MDd)还是静态运行时库(/MT或/MTd)。 - **/MD** 和 **/MDd**:表示...

    VS2010运行时DLL(还有VC6.0)

    标题“VS2010运行时DLL(还有VC6.0)”涉及的是Microsoft Visual Studio 2010中的动态链接库(DLL)文件,这些文件是应用程序在运行时需要的组件,用于提供各种功能和服务。这些DLLs通常包括C++运行时库,它们是Visual...

    VC- Project Setting-Debug-Project Option语法解释

    例如,/MD和/MDd选项告诉编译器链接到多线程运行时库(MSVCRT.LIB和MSVCRTD.LIB),适用于动态链接到C运行时库的调试和非调试版本。相反,/ML和/MLd选项链接到单线程的LIBC.LIB和LIBCD.LIB,而/MT和/MTd则链接到静态...

    [VS2005]解决“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”

    修改编译选项,将/MD或/MDd 改为 /MT或/MTd,这样就实现了对VC运行时库的静态链接,在运行时就不再需要VC的dll了。 方法三: 工程-》属性-》配置属性-》常规-》MFC的使用,选择“在静态库中使用mfc” 这样...

    VC Debug 和 Release的区别

    在 Release 版本中,有一些不同的编译选项,例如 /MD /ML 或 /MT,它们使用发布版本的 Runtime Library。/O1 或 /O2 选项打开优化开关,使程序最小或最快。/D "NDEBUG" 选项关闭条件编译调试代码开关。/GF 选项合并...

    在vs中仿真uc/gui的例程,摆脱vc++

    - **解决方案2**:修改项目设置中的多线程选项,从`/MD`切换到`/MT`,然后再切换回来。这种方法有时可以解决DLL查找问题。 - **解决方案3**:如果以上方法都无法解决问题,可以尝试禁用嵌入清单功能。 **问题2:...

    VS2013+OpenCV 2.4.9项目生成EXE文件如何在其他电脑上直接运行

    - **运行库**:Debug模式下设置为“多线程调试DLL(/MDd)”,Release模式下设置为“多线程DLL(/MD)”。 - **库文件**:在构建完成后,需要将生成的dll文件与可执行文件一起复制到目标计算机上。 #### 测试 1. ...

    VC++链接错误分析解决

    - 使用不同的编译选项(如/MD与/MT)编译的库文件和应用程序之间的不兼容也可能引发此类错误。 **4. 编译器设置不当** - 编译器的配置问题,比如项目设置中的链接器选项错误,也是常见的原因。 **5. Unicode/MFC...

    VC++6.0编译选项大全

    - **/MD**: 使用动态链接C运行时库。 - **/MDd**: 使用调试版本的动态链接C运行时库。 - **/ML**: 使用静态链接C运行时库。 - **/MLd**: 使用调试版本的静态链接C运行时库。 - **/MT**: 使用静态链接C运行时库...

    代码编程点滴很有用的

    - `/MD`、`/ML` 或 `/MT`:使用发布版的运行时库。 - `/O1` 或 `/O2`:优化代码,使其更快或更小。 - `/D "NDEBUG"`:关闭调试代码编译开关。 - `/GF`:合并重复字符串,将其放在只读内存中。 **编程注意事项**...

    Windows下编译和JSONCPP的使用入门

    4. **更改运行库** (`Runtime Library`) 的设置,例如选择 `/MD` 或 `/MDd` 以匹配项目的设置。 **运行时库设置表**: | 开关 | 对应的库 | 版本 | |------|-------------------------|------------------------| | ...

    常见的错误集合解决方案.docx

    - **多线程DLL(/MD)**:release版本多线程动态库,对应libboost_thread-vc90-mt-1_44.lib。 - **多线程调试DLL(/MDd)**:debug版本多线程动态库,对应libboost_thread-vc90-mt-gd-1_44.lib。 3. **动态库的...

    vs2008发布所需类库

    在软件开发过程中,使用Visual Studio 2008 (VS2008) 进行项目构建时,为了确保应用程序能够在目标系统上顺利运行,需要正确地配置运行时库以及相关联的动态链接库(DLLs)。这些DLLs通常包括但不限于标准C++库、MFC...

    CLapace在vs2008下的编译与使用

    根据 Debug 或 Release 模式选择 `/MTd`、`/MDd`、`/MT` 或者 `/MD`。 - **第三步:编译各个子项目** 依次编译 `libf2c` 子项目、`tmglib` 子项目、`blas` 子项目和 `CLAPACK` 子项目。这将会生成四个 `.lib` 文件...

Global site tag (gtag.js) - Google Analytics