Visual Studio中/MD /MDd /MT /MTd的含义以及_ITERATOR_DEBUG_LEVEL错误的解决方法

2022-03-08 09:10:37 浏览数 (1)

先上结论,如果你遇到了_ITERATOR_DEBUG_LEVEL doesnt match error,那一定是你链接的库的DEBUG或RELEASE版本与你当前的项目活动配置不符。不同的值代表的含义如下:

_ITERATOR_DEBUG_LEVEL = 0 (in release mode) _ITERATOR_DEBUG_LEVEL = 1 (in release mode if _SECURE_SCL is defined) _ITERATOR_DEBUG_LEVEL = 2 (in debug mode)

网上流行的答案都是说在“项目属性/配置属性/ C,C /预处理器/预处理器定义”这里加上"_ITERATOR_DEBUG_LEVEL=0或2"。但是这样的做法并不总是见效,我认为可以补充一种方法:

首先看清楚你现在的项目活动配置是DEBUG还是RELEASE,假设为RELEASE,也就是你现在要生成RELEASE版本的解决方案,那么再到“项目属性/配置属性/ C,C /代码生成/运行库”这里看看你选择的是不是“多线程调试(/MTd)”或者“多线程调试DLL(/MDd)”,如果是的话,那就很简单了,既然你要生成RELEASE版本的解决方案,当然不能用调试版本的运行库了,所以相应的改为/MT或/MD即可。反之亦然。

那么/MTd /MDd /MT /MD又都是什么含义呢?其实MSDN上就有答案。开宗明义一句话:这些选项允许你选择运行时库是静态库还是动态库,是debug版还是release版。

所谓动态库,即DLL(Dynamic Link Library )。DLL是一个包含可由多个程序同时使用的代码和数据的库,而不是可执行文件。动态链接提供了一种方法使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个DLL 副本的内容。一般生成动态库后会产生两个文件即DLL文件和对应DLL文件的LIB文件,其中DLL文件存储了具体的程序,而LIB文件只是这些程序的一个目录或者说是索引。当调用DLL文件时,需要在“项目属性/配置属性/链接器/输入”中加载对应DLL的LIB文件。

所谓静态库就是.lib文件,库中的代码最后需要连接到可执行文件中去,所以静态连接的可执行文件一般比较大一些。静态链接库不同于动态链接库(*.dll),在静态库情况下,函数和数据被编译进一个二进制文件(通常扩展名为*.LIB),Visual C 的编译器在链接过程中将从静态库中恢复这些函数和数据并把他们和应用程序中的其他模块组合在一起生成可执行文件。这个过程称为"静态链接",此时因为应用程序所需的全部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行。因此这也导致了使用静态库程序偏大的原因。

静态库和动态库是两种共享程序代码的方式,它们的区别是:静态库在程序的链接阶段被复制到了程序中,和程序运行的时候没有关系;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。使用动态库的优点是系统只需载入一次动态库,不同的程序可以得到内存中相同的动态库的复本,因此节省了很多内存。

再来详细的看看各选项的含义,想必就很好理解了:

/MD

使应用程序使用运行库的多线程并特定于 DLL 的版本。 定义 _MT 和 _DLL,并使编译器将库名 MSVCRT.lib 放入 .obj 文件中。 用此选项编译的应用程序静态链接到 MSVCRT.lib。 此库提供允许链接器解析外部引用的代码的层。 实际工作代码包含在 MSVCR100.DLL, 中,该库必须在运行时对于与 MSVCRT.lib 链接的应用程序可用。

/MDd

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

/MT

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

/MTd

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

要注意的是:

传递给链接器的给定调用的所有模块都必须使用相同的运行库编译器选项(/MD、/MT)进行编译即不要混合使用库的静态版本和动态版本。关于这一点的demo参见这里。

0 人点赞