这里总结下他们的区别,后面的那个'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
分享到:
相关推荐
OPENSSL-1.1.0i编译好的WINDOWS平台VS2013 X64。分了DEBUG/RELEASE、 MT/MTD/MD/MDD
OpenCV2413.6版本在VS2010下编译的32位静态库,包含了运行时库/MDd/MD/MTd/MT下的静态库。
OpenCV2413.6版本在VS2010下编译的带有pdb文件的静态库,包含了运行时库/MDd/MD/MTd/MT下的静态库。
在Win7用VS2015编译,目标平台x64,用MD/MDd方式链接运行库。 按官网文档生成的lib默认链接方式为MT/MTd,此上传文件以MD/MDd方式链接。文件包含完整的vs2015解决方案、最终编译成果lib、exe等全部文件可以直接使用...
libcurl+openssl-64位动态库(包含MD版本和MDd版本)libcurl+openssl-64位动态库(保护MD版本和MDd版本)
VS2010下编译的libcurl库,支持OpenSSL,支持Zlib,分别编译出/MT /MTd /MD /MDd运行时库下的静态库。
我在链接OpenSSL的静态函数库时遇到类似以下的问题: Linking... msvcrt.lib(MSVCRT.dll) : error LNK2005: _strchr already defined in libcmtd.lib(strchr.obj) ... 这是由于OpenSSL的静态函数库使用的是了...
-链接- /MD 与 MSVCRT.LIB 链接 link with MSVCRT.LIB /MDd 与 MSVCRTD.LIB 调试库链接 link with MSVCRTD.LIB debug lib /ML 与 LIBC.LIB 链接 link with.../link [链接器选项和库] [linker options and libraries]
google是头文件,里面有32和64位相关静态库的debug和release版本以及编译proto文件的protoc.exe,运行时库是MD和MDd,官方默认是MT和MTd
源码文件:zint-2.12.0-src.tar.gz 编译环境:Win11 64 位 + VS2017 使用环境:理论上适用所有Windows系统 注意事项: ... 多线程DLL(/MD) → libzint_MD.lib 多线程调试DLL(/MDd) → libzint_MDd.lib
修改编译选项,将/MD或/MDd 改为 /MT或/MTd,这样就实现了对VC运行时库的静态链接,在运行时就不再需要VC的dll了。 方法三: 工程-》属性-》配置属性-》常规-》MFC的使用,选择“在静态库中使用mfc” 这样...
该链接库配合官网上下载并安装的Qt5.10.1使用,把此lib替换掉已安装的即可(默认安装的是MD、MDd)
vs2005 工程运行需要的时库,如果使用vs2005 /MDd 编译的工程在没有vs2005环境时运行,请添加这个时库,来避免配置错误的提示
建议使用MDd和MD方式,带上对应的dll(在glog\bin目录,需要时拷贝到bin文件输出目录)可以避免使用MTd,MT引起的内存泄露是值得的。 #include #include using namespace std; //包含glog头文件,建议放在stdafx....
编译版本 openssl-1.0.0d 文件目录结构 | bin | openssl.exe //openssl可执行程序 libeay32.dll //openssl用到的...注:项目属性->配置属性->C/C++->代码生成,运行库选择多线程DLL(/MD)或多线程调试DLL(/MDd)
DCMTK3.6.2+VS2015(MD支持版)编译和安装示范,本文的编译机器是Windows10 64位系统,使用VS2015和cmake3.7.2编译DCMTK源码为64位包(运行时库为MD或MDd)。
/nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /Fp"Debug/WritingDlgTest.pch" /Yu"stdafx.h" /Fo"Debug/" /Fd"Debug/" /FD /GZ /c 各个参数代表的意义,...
牛津高阶英汉双解词典V2.0 的mdx文件、mdd文件(适用手机)、css文件(适用电脑) (css即层叠样式表) 使用建议: 安卓(iOS应该也可以吧,各位自己琢磨一下,知乎上都有):将mdx、mdd装在手机的eudb_en目录下 ...
v8版本8.0.397 win10下vs2019编译的x64静态库 debug版本/MDd release版本/MD