这里总结下他们的区别,后面的那个'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
分享到:
相关推荐
- 根据项目需求选择合适的运行时库配置(/MD、/MDd、/MT、/MTd)。 - 确保所有依赖项都已正确设置,包括头文件目录和库目录。 - 对于静态库,注意可能出现的链接冲突或大小问题,因为静态库会将所有依赖的库代码包含...
4. **MDd/MD/MTd/MT**:这些是链接器选项,它们定义了运行时库的多线程和调试版本。MD和MDd分别代表多线程DLL(动态链接库)的调试和非调试版本,它们依赖于VC++运行时库的动态链接版本。MT和MTd则对应于多线程静态...
**/MD 和 /MDd** 则对应动态链接C运行时库的选项。当使用这些选项编译时,libcurl库会依赖系统上的msvcr100.dll(或对应的调试版本msvcr100d.dll)。这样做的好处是减少了可执行文件的大小,因为运行时库代码是共享...
md, mt - Visual Studio 编译器选项(静态库); dbg - 表示存在调试信息(/mtd、/mdd 等); rwd - 包含调试信息的发布版本(用于重现某些类型的运行时问题); amd64 - 为 x86 AMD64 平台构建的库。 TD_CHM_Docs ...
我在链接OpenSSL的静态函数库时遇到类似以下的问题: Linking... msvcrt.lib(MSVCRT.dll) : error LNK2005: _strchr already defined in libcmtd.lib(strchr.obj) ... 这是由于OpenSSL的静态函数库使用的是了...
3. **选择编译类型**:在编译jsoncpp的库文件时,需要根据实际情况选择编译模式,例如Debug或Release版本,以及是否使用动态运行时库(/MD或/MDd)还是静态运行时库(/MT或/MTd)。 - **/MD** 和 **/MDd**:表示...
标题“VS2010运行时DLL(还有VC6.0)”涉及的是Microsoft Visual Studio 2010中的动态链接库(DLL)文件,这些文件是应用程序在运行时需要的组件,用于提供各种功能和服务。这些DLLs通常包括C++运行时库,它们是Visual...
例如,/MD和/MDd选项告诉编译器链接到多线程运行时库(MSVCRT.LIB和MSVCRTD.LIB),适用于动态链接到C运行时库的调试和非调试版本。相反,/ML和/MLd选项链接到单线程的LIBC.LIB和LIBCD.LIB,而/MT和/MTd则链接到静态...
修改编译选项,将/MD或/MDd 改为 /MT或/MTd,这样就实现了对VC运行时库的静态链接,在运行时就不再需要VC的dll了。 方法三: 工程-》属性-》配置属性-》常规-》MFC的使用,选择“在静态库中使用mfc” 这样...
在 Release 版本中,有一些不同的编译选项,例如 /MD /ML 或 /MT,它们使用发布版本的 Runtime Library。/O1 或 /O2 选项打开优化开关,使程序最小或最快。/D "NDEBUG" 选项关闭条件编译调试代码开关。/GF 选项合并...
- **解决方案2**:修改项目设置中的多线程选项,从`/MD`切换到`/MT`,然后再切换回来。这种方法有时可以解决DLL查找问题。 - **解决方案3**:如果以上方法都无法解决问题,可以尝试禁用嵌入清单功能。 **问题2:...
- **运行库**:Debug模式下设置为“多线程调试DLL(/MDd)”,Release模式下设置为“多线程DLL(/MD)”。 - **库文件**:在构建完成后,需要将生成的dll文件与可执行文件一起复制到目标计算机上。 #### 测试 1. ...
- 使用不同的编译选项(如/MD与/MT)编译的库文件和应用程序之间的不兼容也可能引发此类错误。 **4. 编译器设置不当** - 编译器的配置问题,比如项目设置中的链接器选项错误,也是常见的原因。 **5. Unicode/MFC...
- **/MD**: 使用动态链接C运行时库。 - **/MDd**: 使用调试版本的动态链接C运行时库。 - **/ML**: 使用静态链接C运行时库。 - **/MLd**: 使用调试版本的静态链接C运行时库。 - **/MT**: 使用静态链接C运行时库...
- `/MD`、`/ML` 或 `/MT`:使用发布版的运行时库。 - `/O1` 或 `/O2`:优化代码,使其更快或更小。 - `/D "NDEBUG"`:关闭调试代码编译开关。 - `/GF`:合并重复字符串,将其放在只读内存中。 **编程注意事项**...
4. **更改运行库** (`Runtime Library`) 的设置,例如选择 `/MD` 或 `/MDd` 以匹配项目的设置。 **运行时库设置表**: | 开关 | 对应的库 | 版本 | |------|-------------------------|------------------------| | ...
- **多线程DLL(/MD)**:release版本多线程动态库,对应libboost_thread-vc90-mt-1_44.lib。 - **多线程调试DLL(/MDd)**:debug版本多线程动态库,对应libboost_thread-vc90-mt-gd-1_44.lib。 3. **动态库的...
在软件开发过程中,使用Visual Studio 2008 (VS2008) 进行项目构建时,为了确保应用程序能够在目标系统上顺利运行,需要正确地配置运行时库以及相关联的动态链接库(DLLs)。这些DLLs通常包括但不限于标准C++库、MFC...
根据 Debug 或 Release 模式选择 `/MTd`、`/MDd`、`/MT` 或者 `/MD`。 - **第三步:编译各个子项目** 依次编译 `libf2c` 子项目、`tmglib` 子项目、`blas` 子项目和 `CLAPACK` 子项目。这将会生成四个 `.lib` 文件...